Array.push() изменяет массив?

#javascript #arrays

#javascript #массивы

Вопрос:

Я делаю:

   const array = []

  ...
  array.push({x, y})

 

Это считается плохой практикой. Должен ли я использовать let или spread массив, потому что «push» считается мутирующим действием. Тем не менее, он работает.

Комментарии:

1. Зависит от того, хотите ли вы избежать изменения массива? Обратите внимание, что мутация сама по себе неплоха, зависит от вашего варианта использования.

2. Я преувеличиваю, но это все равно, что спросить: «Можно ли добавить два числа или я должен их умножить?». Это действительно зависит от того, что вы хотите / нуждаетесь в результате.

3. Я не понимаю вопроса, вы не уверены в том, что означает mutate ? (название подразумевает, что вы, кажется, не уверены в этом, но тело немного отличается)

4. «Должен ли я использовать let» . У вас сложилось впечатление, что вам не разрешены push массивы, определенные с const помощью? Вам НЕ разрешено переназначать переменные с const помощью like array = [1,2] . Вам разрешено изменять массивы и объекты, изменяя их свойства. Как const a = {} и a.key1 = 'value' разрешено. Но, a = { key2: 'value 2 '} не допускается

5. Это именно тот случай использования. Массив, в который я помещаю объект. Теперь я вижу, что изменение массива обычно не является проблемой и может быть выполнено с помощью const .

Ответ №1:

Array.push() изменяет массив?

ДА

Это считается плохой практикой. Должен ли я использовать let или spread массив, потому что «push» считается мутирующим действием.

Как правило, нет.

Бывают случаи, когда обработка данных как неизменяемых полезна или даже необходима (например, при обновлении хранилища Redux).

В этих случаях push все еще неплохая идея, вы просто не должны делать это с вашим исходным массивом.

Например, это нормально и не имеет побочных эффектов:

 function functionalFunction(input) {
    const output = [...input];
    output.push({x, y});
    // A bunch of other operations that mutate the array go here
    // Be careful not to mutate any objects in the array
    return output;
}