Простой JS массив `concat` разъяснения - PullRequest
0 голосов
/ 27 августа 2018

Я понимаю, как работает метод concat, но у меня был один вопрос о строке в MDN документах .

Там написано:

Методы concat не изменяют this или любой из массивов, представленных в качестве аргументов, но вместо этого возвращают поверхностную копию, которая содержит копии тех же элементов, объединенных из исходных массивов.


Мои вопросы, как это возможно для потенциально изменить this?Это говорит о том, что массивы аргументов потенциально могут потерять свои this, но вместо этого он сохраняет их, поскольку просто создает новый массив?

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Некоторые функции видоизменяют аргументы, которые передаются в него, или видоизменяют их вызывающий контекст.Одним из примеров является .sort() - если вы возьмете массив someArr, а затем выполните const result = someArr.sort(), то и result , и оригинал someArr будут отсортированы (они будут ссылаться на один и тот же объект).

Напротив, concat не изменяет ни один из переданных массивов, ни его вызывающий контекст.Человек, не имеющий предварительного знания JS, может подумать, что concat добавляет элементы в массив, к которому вызывается concat, как это делает следующий код:

Array.prototype.myConcat = function(...arrs) {
  arrs.forEach((arr) => {
    arr.forEach(item => {
      this.push(item);
    });
  });
}

const orig = [1, 2, 3];
const another = [4, 5, 6];
orig.myConcat(another);

console.log(orig);

Но это не то, как работает нативная функция concat - вместо этого она создает совершенно новый массив , что и предусмотрено документациейуточнить.

0 голосов
/ 27 августа 2018

Когда функция вызывается как метод объекта (например, массив в этом примере), this устанавливается для объекта, для которого вызывается метод.Я думаю, что это самая важная вещь, которую нужно отнять от этого ...

Другими словами, в документации просто говорится, что исходный объект, для которого вызывается concat, не будет видоизменен, поскольку он concat создает новый массив .Так что concat является одной из немногих функций массива, которые не изменяют this.Array.sort / Array.push как уже упоминалось, мутирует контекст, в котором они вызываются.

Функции, которые не мутируют контекст, к которому они вызваны, или их аргументы в некоторых случаях предпочтительны, поскольку они невызывают какие-либо побочные эффекты.Они также называются pure функциями, поскольку при заданном входе они всегда выдают один и тот же вывод при нулевых побочных эффектах.

Существует целый поднабор lodash, например, под названием lodash / fp посвящен идее чистых функций и функционального программирования из-за некоторых из этих преимуществ.Существует также Рамда и т. Д.

Надеюсь, это поможет.

0 голосов
/ 27 августа 2018

В вызове a.concat(b, c) вызывается функция a.concat, значение this равно a, а аргументы b и c.MDN говорит, что массив a не изменяется этим вызовом - в отличие, например, от a.push(x).

const arr = [1, 2, 3];

arr.concat([4, 5]);
console.log(arr.join(', '));
// the “this” array in the call `arr.concat([4, 5])` didn’t change

arr.push(6);
console.log(arr.join(', '));
// the “this” array in the call `arr.push(6)` changed
...