我正在进行关于反应式编程的Netflix教程,我遇到了一些我不太了解的代码。
Array.prototype.mergeAll = function() {
var results = [];
this.forEach(function(subArray) {
results.push.apply(results, subArray);
});
return results;
};
为什么在这行代码apply
中使用results.push.apply(results, subArray);
?为什么不使用results.push(subArray)
?代码有什么区别?
答案 0 :(得分:4)
结果完全不一样。你可以自己测试一下:
results = [1, 2, 3];
subArray = [4, 5, 6];
results.push(subArray);
console.log("With push:", results); // With push: [1, 2, 3, [4, 5, 6]]
results = [1, 2, 3]; // reset results
results.push.apply(results, subArray);
console.log("With apply:", results); // With apply: [1, 2, 3, 4, 5, 6]
apply
接受一个参数数组,数组的元素成为函数的单独参数。
这使您可以使用任意数量的参数调用函数push
,其中每个参数都添加到数组中。简单地调用results.push(...)
将使用 single 参数调用该函数,该参数将是一个数组,从而导致整个subArray
作为一个元素被推送到results
。
在上面的示例中,results.push.apply(results, subArray)
相当于调用results.push(4, 5, 6)
,而results.push(subArray)
只调用results.push([4, 5, 6])
。
使用一个相对于另一个的净效果是,给定包含子数组的输入数组......
[[1, 2, 3], [4, 5, 6], [7, 8], [9]]
...使用results.push
将生成一个相同的数组,其中每个子数组作为单个元素被推送到results
:
[[1, 2, 3], [4, 5, 6], [7, 8], [9]]
使用results.push.apply
会导致每个子数组中的每个元素作为自己的元素被推送到results
,从而产生所需的扁平数组:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
答案 1 :(得分:0)
示例1:
var results = [];
results.push.apply(results,[2,3,4])
results [2,3,4]
示例2:
var results2 = [];
[].push.apply(results2,[2,3,4])
// results2 [2,3,4]
results.push.apply 与 []。push.apply 相同。它们都代表数组的推送方法。
apply()方法中的第一个参数:results / results2,表示Array.prototype.push方法中的范围/ this。
这是the link给出一个很好的例子,apply()方法中的第一个参数是如何工作的。
如果你想知道,为什么apply()方法的第二个参数是参数数组。 This link的例子有很好的解释。
基本上
[].push.apply(results2,[2,3,4])
// results2 [2, 3, 4]
result2.push(2,3,4)
// results2 [2, 3, 4]
第一种方法等于第二种方法