.slice.call vs .push在javascript中

时间:2014-02-15 14:42:14

标签: javascript arrays

我的一位朋友使用[].slice.call()来填充匹配元素的数组。

我想知道这是如何运作的。我只知道Array.prototype.push填充数组。

此外,我已经看到填充数组的两种技术都有所不同。

所以我的问题是:

  • Array.prototype.slice如何帮助填充数组?
  • Array.prototype.sliceArray.prototype.push制作对象和数组的角色是什么?

Fiddle

var arr=[];
var arr=[].slice.call($('[id^=name]'));
//arr.push($('[id^=name]'))
console.log(arr)

3 个答案:

答案 0 :(得分:6)

数组的.slice()方法返回数组部分的浅拷贝。它是作为Array原型的一个方法编写的,因此它操作的数组就是在其上下文中调用它的数组。通常情况就是这样:

var newArray = oldArray.slice(2, 4);

当您使用.slice()调用.call()方法时,您可以明确控制this的值。在朋友的代码中,他将jQuery对象作为this值传递。因为没有其他参数,.slice()完整地返回jQuery对象的浅表副本,作为新数组。 (像其他一些类似的方法一样,.slice()可以处理任何看起来像数组的东西:基本上,任何具有.length属性和数字索引属性的东西。一个jQuery对象符合该描述。)

但是,由于jQuery已经有一个内置的方法来返回所有匹配元素的普通数组,所以你的朋友不应再费心了:

var plainArray = $('[id^=name]').get();

这完全是一回事。使用.slice()不是错误的,但它有点毫无意义。

答案 1 :(得分:3)

$('[id^=name]').get()怎么样?

[].slice.call方法利用jQuery对象的类似数组length和数字键属性来重用Array.prototype的有意泛型方法。标准记录了方法Array.prototype.slice,通过执行特定算法返回新的Array对象,该算法按this对象的顺序访问数字键控属性 - 无论其类型如何 - 分配新Array的顺序元素的值。

我不会使用任何一种方法,因为jQuery有get(),它被记录为返回匹配元素的数组。为什么要使用更模糊或更不直接的方法?

答案 2 :(得分:1)

我对这种情况没有任何指定的原因,但我知道的是,.slice()也用于创建数组的另一个实例,而这里切片为其实例添加一个空格,因为它没有参数。

Javascript是您以1000种不同方式执行单个操作的语言!这取决于你的选择! 但是,我们必须遵循为特定操作所做的语法。