Расширение сбоев Array.prototype - PullRequest
       20

Расширение сбоев Array.prototype

2 голосов
/ 05 октября 2019

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

const a = [1, 2, 3, 4, 5];

//this is what I tried
Array.prototype.multiply = function() {
  for (m of this) this.push(m * m);
}

a.multiply(); //this should not be changed
console.log(a); // [1, 2, 3, 4, 5, 1, 4, 9, 16, 25] (expected output)

Ответы [ 2 ]

3 голосов
/ 05 октября 2019

Когда вы помещаете значение в тот же массив во время цикла , вы попадаете в бесконечный цикл , создаете толчок временного массивазначение к нему, в конце добавить его к this

const a = [1, 2, 3, 4, 5];

//this is the what I tried
Array.prototype.multiply = function() {
  let newArr = []
  for (const m of this) {
    newArr.push(m * m)
  }
  this.push(...newArr)
}

a.multiply();
console.log(a);

При этом не следует переопределять prototype, просто используйте функцию и передайте параметры

const a = [1, 2, 3, 4, 5];

function multiply(arr) {
  return [...arr, ...arr.map(a => a * a)]
}

console.log(multiply(a));
1 голос
/ 05 октября 2019

Добавление нового значения в массив в середине цикла for ... of создает бесконечный цикл, так как цикл включает в себя новые значения. Вместо этого вы можете использовать forEach, так как это игнорирует добавленные новые значения:

const a = [1, 2, 3, 4, 5];

Array.prototype.multiply = function() {
    this.forEach(v => this.push(v*v));
}

a.multiply(); //this should not be changed
console.log(a); // [1, 2, 3, 4, 5, 1, 4, 9, 16, 25] (expected output)
...