如何使用字符串数组的apply方法?

时间:2017-09-09 09:14:06

标签: javascript arrays apply

有人可以向我解释为什么我无法正确使用字符串数组的apply方法吗?

function speak(line) {
     console.log(line);
}
var whiteRabbit = {type: "white", speak: speak};
speak.apply(whiteRabbit, ["Burp!","Skree","Hello"]);

输出为Burp,为什么不是整个数组呢?以及如何使用apply方法实现这一目标?

5 个答案:

答案 0 :(得分:1)

Function#apply将数组扩展为函数参数,因为您的唯一参数是line,数组中的第一项被分配给它,其余项被忽略。

顺便说一句 - 由于speak函数无法以任何方式使用thisapply的第一个参数并不重要在这种情况下。

如果您要为该功能添加更多参数,您可以看到它的工作原理:



function speak(a, b, c) {
     console.log(a, b, c);
}

speak.apply(null, ["Burp!","Skree","Hello"]);




如果需要显示未知长度的数组,最好使用Function#call调用该函数,然后迭代数组,或将其转换为可呈现的内容。例如:



function speak(arr) {
  console.log(arr.join(' '));
}

speak.call(null, ["Burp!", "Skree", "Hello", "Cats"]);




答案 1 :(得分:1)

来自Function#apply

  

apply() 方法调用具有给定this值的函数,并将arguments作为数组(或array-like object)提供。

您只将数组的第一个元素作为参数line。如果您使用更多参数,您也可以看到数组的其余部分。



function speak(line, line1, line2) {
    console.log(line);
    console.log(line1);
    console.log(line2);
}

var whiteRabbit = {
    type: "white",
    speak: speak
};

speak.apply(whiteRabbit, ["Burp!", "Skree", "Hello"]);




如果您希望将值用作数组,则可以使用arguments并迭代值。



function speak() {
    Array.prototype.forEach.call(arguments, function (s) {
        console.log(s);
    });
}

var whiteRabbit = {
    type: "white",
    speak: speak
};

speak.apply(whiteRabbit, ["Burp!", "Skree", "Hello"]);




Wit ES6你可以使用rest parameters ...



function speak(...args) {
    args.forEach(s => console.log(s));
}

var whiteRabbit = {
    type: "white",
    speak: speak
};

speak.apply(whiteRabbit, ["Burp!", "Skree", "Hello"]);




答案 2 :(得分:0)

我将假设fatRabbit应该是whiteRabbit,而您的问题就是为什么您只看到Burp!而不是完整数组。

原因是apply使用数组通过离散参数调用您的函数,因此第一个条目显示为line参数,而您不是看到其他人,因为你没有参数。

如果您想查看数组,请使用call而不是apply;然后line将引用数组,而不仅仅是第一个条目:

function speak(line) {
     console.log(line);
}
var whiteRabbit = {type: "white", speak: speak};
speak.call(whiteRabbit, ["Burp!","Skree","Hello"]);

或者,在方法中添加更多参数(speak(line1, line2, line3))。

在评论中,你问过:

  

你能说明如何让它变得动态吗?

如果通过“动态”表示它会记录尽可能多的条目,我会使用call(如上所述)和循环:​​

function speak(lines) {
    lines.forEach(function(line) {
        console.log(line);
    });
}
var whiteRabbit = {type: "white", speak: speak};
speak.call(whiteRabbit, ["Burp!","Skree","Hello"]);

使用forEach,但you have lots of other options

答案 3 :(得分:0)

您需要添加更多参数

function speak(line, line2, line3) {
     console.log(line, line2, line3);
}
var whiteRabbit = {type: "white", speak: speak};
speak.apply(whiteRabbit, ["Burp!","Skree","Hello"]);

答案 4 :(得分:0)

你可以让兔子一个接一个地说:

 ["Burp!","Skree","Hello"].forEach( speak );

如果您也想更改上下文:

["Burp!","Skree","Hello"].forEach( word => speak.call(rabbit, word));