在数组的.concat上调用.apply

时间:2019-01-30 02:41:36

标签: javascript variadic-functions

我正在为提供更多功能的常见JavaScript类型创建包装器。除了新的方法和属性外,它们还具有与其包装类型相同的所有方法和属性。尽管可能会改变它们的逻辑,但我并没有完全重写现有的方法,因此,我总是在包装值上回调原始方法。

charCodeAt可能是字符串包装的样子:

this.charCodeAt = function (index) {
    return internalValue.charCodeAt(index);
};

在上面的示例中,我不需要做很多事情:

  • index的调用中的参数string.charCodeAt是可选的,因此我不需要编写任何逻辑来处理对{{1 }}。
  • wrapper.charCodeAtindex唯一的参数,因此也无需处理传递给string.charCodeAt的其他变量,因为它们将被忽略。

我在尝试调用接受可变数量参数的方法时遇到问题。有问题的方法是wrapper.charCodeAt。在其他情况下,我编写了代码以将任意数量的参数传递给JavaScript中的函数,而我使用的解决方案是array.concat,其中func.apply(null, argumentArray)是我想要的参数数组传递给argumentArray。这不适用于func

.concat

写入控制台的错误消息显示var array = [0, 1]; var error; try { array.concat.apply(null, [2, 3]); } catch (error) { console.log(error); } 。我研究了将TypeError: Array.prototype.concat called on null or undefinedapply一起使用,似乎在构造函数原型上定义的其他方法也会遇到类似的问题。

为什么concat遇到此问题?将任意数量的参数作为数组传递给诸如array.concat.apply之类的方法的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

调用原型方法并在对this的调用中正确设置apply()自变量应该起作用:

var array = [0, 1];
var error;

try {
    array = Array.prototype.concat.apply(array, [2, 3]);
} catch (error) {
    console.log(error);
}

console.log(array);

答案 1 :(得分:1)

apply期望数组(或类似数组)对象的this值。当你做

array.concat.apply(null, [2, 3]);

this的值为null;实际上与

是一回事
Array.prototype.concat.apply(null, [2, 3]);

任何对原始array的引用都将被忽略。

如果要使用concat输出原始数组的[2, 3],则需要指定this的值应为array

var array = [0, 1];
var arrayToConcat = [2, 3];
const result = array.concat.apply(array, arrayToConcat);
console.log(result);

// or, use array spread:
const result2 = [...array, ...arrayToConcat];
console.log(result2);

// or, use concat without anything special at all:
const result3 = array.concat(arrayToConcat);
console.log(result3);

(从技术上讲,您可以使用非数组对象作为this的{​​{1}},但这很奇怪)