[] .slice或Array.prototype.slice

Dav*_*ing 17 javascript arrays syntax prototype object

我遇到了将Array原型应用于本机对象的两种方法:

arr = Array.prototype.slice.call(obj);
arr = [].slice.call(obj);
Run Code Online (Sandbox Code Playgroud)

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

type = Object.prototype.toString.call(obj);
type = {}.toString.call(obj);
Run Code Online (Sandbox Code Playgroud)

一个简单的测试:

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

fn(0,1);
Run Code Online (Sandbox Code Playgroud)

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

他们看起来和我一模一样; 第一种语法使用得更频繁,但第二种语法肯定更短.使用较短的语法时是否有任何缺点?

Rob*_*b W 25

它们在功能上是相同的.

但是,该Array对象可能会被覆盖,导致第一种方法失败.

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

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

当您打算多次使用该方法时,最佳做法是缓存该方法:

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

  • 你甚至可以使用`Object.getPrototypeOf([]).slice`如果你有一些非理性的恐惧,有人会覆盖`Array`.等等,如果有人覆盖`对象'怎么办?......;) (13认同)
  • 在JS中可以打破很多东西.如果更改了"Array.prototype.slice",则两个变体都不会按预期运行.让我想起重新定义的`undefined` ...无论如何,创造无用的对象并不昂贵,但考虑到垃圾收集的成本,它可能会在一个紧密的循环中加起来. (3认同)