有人可以解释一下这行代码是如何运作的。
[].push.apply(perms, permutation(arr.slice(0), start + 1, last));
此函数生成一个包含输入数组的所有排列的数组;
var permutation = function(arr, start, last){
var length = arr.length;
if(!start){
start = 0;
}
if(!last){
last = length - 1;
}
if( last === start){
return [arr];
}
var temp;
var perms = [];
for(var i = start; i < length; i++){
swapIndex(arr, i, start);
console.log(arr);
[].push.apply(perms, permutation(arr.slice(0), start + 1, last));
swapIndex(arr, i, start);
}
return perms;
};
答案 0 :(得分:3)
[].push
创建一个新数组,然后提取push
,它与Array.prototype.push
相同,但每次需要进行垃圾回收时都会创建一个未使用的对象。
如果你致电Array.prototype.push(5)
它将无法正常工作,因为this
不会被设置为数组或扩展数组的内容。因此,如果要使用任意函数作为方法,则需要使用Function.call
,Function.apply
或Function.bind
来设置this
。
如果你有
Array.prototype.push.apply(thisObject, arrArguments)
与...相同
如果thisObject.push(arrArguments[0], arrArguments[1], ..., arrArguments[n])
在其原型链中有thisObject
,则push
。由于perms
是一个数组,并且在其自己的原型链中有push
,因此可以将其替换为:
perms.push.apply(perms, permutation(arr.slice(0), start + 1, last));
使用apply
是因为push
获取permutations
数组的所有内容作为参数。因此,如果permutations(....)
返回[1,2,3]
,则它将与perms.push(1, 2, 3)
同义。你可以通过为每个元素调用apply
而不用push
来编写它:
for (var e of permutation(arr.slice(0), start + 1, last)) {
perms.push(e);
}
在ES6中,您只需使用与apply
相同的spread syntax,但更容易理解:
perms.push(...permutation(arr.slice(0), start + 1, last))
答案 1 :(得分:0)
扩展它与:
相同 apply()
Array.prototype.push
来自Function.prototype.apply()
,"Array.prototype"
是一个函数。
使用空数组而不是编写push()
会公开可以调用apply()
的{{1}}方法并且只是因为"[]"
要写的字符少于"Array.prototype"
{1}}。