什么是.apply在这个JavaScript代码中做什么?

时间:2014-07-12 14:25:06

标签: javascript

我正在进行关于反应式编程的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)?代码有什么区别?

2 个答案:

答案 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]

第一种方法等于第二种方法