.slice.call vs .push in javascript



我的一个朋友使用[].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)

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

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

使用.call()调用.slice()方法时,可以显式控制this的值。在您朋友的代码中,他正在传递一个jQuery对象作为this值。由于没有其他参数,.slice()将jQuery对象的一个浅拷贝作为一个新数组返回。(与其他一些类似的方法一样,.slice()将处理任何看起来像数组的东西:基本上,任何具有.length属性和感兴趣的数字索引属性的东西。jQuery对象适合这种描述。)

然而,由于jQuery已经有了一个内置的方法来返回所有匹配元素的纯数组,所以你的朋友不应该再这么做了:

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

这做了完全相同的事情。使用.slice()并不是错误的,但它有点毫无意义。

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

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

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

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

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