我的一位朋友使用[].slice.call()
来填充匹配元素的数组。
我想知道这是如何运作的。我只知道Array.prototype.push
填充数组。
此外,我已经看到填充数组的两种技术都有所不同。
所以我的问题是:
Array.prototype.slice
如何帮助填充数组?Array.prototype.slice
和Array.prototype.push
制作对象和数组的角色是什么?var arr=[];
var arr=[].slice.call($('[id^=name]'));
//arr.push($('[id^=name]'))
console.log(arr)
答案 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种不同方式执行单个操作的语言!这取决于你的选择! 但是,我们必须遵循为特定操作所做的语法。