首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >[].slice或Array.prototype.slice

[].slice或Array.prototype.slice
EN

Stack Overflow用户
提问于 2012-01-26 00:49:14
回答 2查看 4.9K关注 0票数 18

我遇到过两种将Array原型应用于原生对象的方法:

arr = Array.prototype.slice.call(obj);
arr = [].slice.call(obj);

以类似的方式,获取本机类数组对象的真实类型:

type = Object.prototype.toString.call(obj);
type = {}.toString.call(obj);

一个简单的测试:

function fn() {
    console.log(
        Array.prototype.slice.call(arguments),
        [].slice.call(arguments),
        Object.prototype.toString.call(arguments), 
        {}.toString.call(arguments)
    );
}

fn(0,1);

小提琴:http://jsfiddle.net/PhdmN/

对我来说,它们似乎是一样的;第一种语法使用得更频繁,但第二种语法肯定更短。使用较短的语法有什么缺点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-26 00:50:59

它们在功能上是相同的。

但是,可以覆盖Array对象,从而导致第一种方法失败。

//Example:
Array = {};
console.log(typeof Array.prototype.slice); // "undefined"
console.log(typeof [].slice);    // "function"

文本方法创建一个新的Array实例(与Array.prototype.方法相对)。两种方法的基准:http://jsperf.com/bbarr-new-array-vs-literal/3

当您要多次使用该方法时,最佳实践是缓存该方法:

  • var slice = Array.prototype.slice; //Commonly used
  • var slice = [].slice; -如果您担心Array的存在,或者您只是喜欢较短的语法。
票数 26
EN

Stack Overflow用户

发布于 2018-10-15 23:29:12

这是一个有趣的问题!让我们分析一下每个替代方案的优缺点(✔️)和缺点(❌):

[].slice

  • ✔️:输入速度更快

两次击键,没有shift键或任何东西,

而且你的林特知道[.slice是一个打字错误。

  • ✔️:阅读速度更快

您可以更快地识别相关部分(slice)。

  • ✔️:更受欢迎

56M+ snippets on GitHub (截至2018年末)。

  • ✔️:无法覆盖

Rob's answer的第一部分演示了这个perfectly.

  • ✔️:运行得更快。

等等,什么?实际上,这就是这个答案的全部意义所在。

与你在任何地方想和读到的相反,[].slice.call(...) Array does实例化一个新的、空的属性只是为了访问它的属性!

如今( 5+多年都是如此--截至2018年末),即时编译 (1)包含在您运行JavaScript的任何地方(除非您仍在使用IE8或更低版本浏览网页)。

该机制允许JS引擎:(2)

...直接解析[].slice,静态解析,作为直接的Array.prototype引用,只需一次可配置的属性访问:forEach

Array.prototype.slice

  • ❌:键入速度较慢

在您尝试运行代码之前,拼写错误(例如:Array.prorotype.slice)看起来很好。

  • ❌:不太受欢迎

8M+ snippets on GitHub (截至2018年末)。

  • ❌:运行速度较慢

Array.prototype.slice是:(2)

...查找Array引用的整个作用域,直到遍历完所有作用域,直到全局 one为止,因为您可以随时将变量命名为Array

一旦达到全局作用域,并且找到了本机,引擎就访问它的proottype,然后访问它的方法

..。

O(N)作用域解析+2个属性访问(.prototype.forEach)。

  • ✔️:允许您无缝地适应任何严格阻止您以([`开头的编码约定

这绝对是一件好事,(sarcastically).

  • ✔️:你不需要解释为什么[].slice在几乎所有方面都更好。

尽管现在,这只会归结为下面的clicking the share link

免责声明

请注意,实际上,两者都不会比另一个运行得更快。这不是应用程序的瓶颈。

你可能想读一读A crash course in just-in-time (JIT) compilers

  • Quoted
  1. (推特上的@WebReflection)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9006553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档