Вызов .apply на .concat массива - PullRequest
       11

Вызов .apply на .concat массива

0 голосов
/ 30 января 2019

Я создаю оболочки для распространенных типов JavaScript, которые предлагают больше возможностей.В дополнение к новым методам и свойствам они имеют все те же методы и свойства, что и типы, для которых они являются оболочками.Я не полностью переписываю уже существующие методы, даже если могу изменить их логику, поэтому я всегда обращаюсь к исходному методу с перенесенным значением.

Вот как может выглядеть charCodeAtобертка вокруг строк:

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

Мне не нужно много делать в приведенном выше примере:

  • Параметр index в вызове string.charCodeAt является необязательным, поэтому мне не нужно писать какую-либо логику, которая бы обрабатывала случай, когда тот же параметр был опущен при вызове wrapper.charCodeAt.
  • index - единственный параметр, который принимает string.charCodeAt, поэтомуТакже нет необходимости обрабатывать дополнительные переменные, передаваемые в wrapper.charCodeAt, так как они будут игнорироваться.

Я столкнулся с проблемой при попытке вызвать метод, который принимает переменное число аргументов.Рассматриваемый метод array.concat.Существуют и другие контексты, в которых я написал код для передачи произвольного числа аргументов функции в JavaScript, и я использовал решение 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 undefined.Я исследовал, используя apply с concat, и похоже, что у меня возникают аналогичные проблемы с другими методами, которые определены в прототипе конструктора.

Почему я сталкиваюсь с этой проблемой с array.concat.apply?Как правильно передать произвольное количество аргументов в виде массива в метод, такой как .concat?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

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 для concat, но это странноделаем)

0 голосов
/ 30 января 2019

Вызов метода-прототипа и правильная установка аргумента 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);
...