我的一个朋友使用[].slice.call()
来用匹配的元素填充数组。
我想知道这是怎么回事。我只知道Array.prototype.push
来填充一个数组。
我还看到填充数组的两种技术有区别。
所以我的问题是:
Array.prototype.slice
如何帮助填充数组Array.prototype.slice
和Array.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多种不同方式执行单个操作的语言!这取决于你的选择!但是,我们必须遵循为特定操作而制定的语法。