Вот код, о котором идет речь:
const array = [
1, 2, 3
]
array.map(item => {
item = item + 1
})
console.log(array)
Я думал, что аргумент item
(first) в методе map
является ссылкой на исходный элемент в массиве и что его изменение напрямую изменит содержимое этого первого массива... это не так?
map
возвращает новый массив, он не изменяет исходный.
item
- это локальная переменная здесь, в функции функции стрелки item => {...}
. Назначение item = item + 1
не меняет исходный элемент, это скорее изменяет item
локальной переменной.
Если вы хотите изменить элементы forEach
функция более эффективна, поскольку не создает новый массив:
array.forEach((item, index) => {
array[index] = item + 1;
});
item
. Затем вы можете сделать item.someproperty = 1
- это вопрос, который задает OP.
operator+
в JavaScript?
В вашем массиве содержатся элементы типа примитивов (целое число здесь). Переменные типа примитива не могут быть изменены по его ссылке. Мутирование возможно, если, например, элементы вашего массива являются объектами, например:
var array = [{val: 1}, {val: 2}, {val: 3}];
array.map(item => {item.val = item.val + 1});
console.log(array);
Mozilla говорит;
Метод map() создает новый массив с результатами вызова предоставленной функции для каждого элемента в вызывающем массиве.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
Таким образом, функция карты не мутирует значения массива.
Я знаю, что вы этого не хотите, но вы можете использовать это:
const array = [
1, 2, 3
]
array.map((item, k) => {
array[k] = item + 1
})
console.log(array)
item = item+1
, вы не изменяетеitem
независимо от того, вызываете ли вы.map
или.forEach
, потому что вы просто переназначаете локальную переменную.