деструктуризация
в цикле если раскоментить деструктуризацию и удалить ниже item и оставить просто name и quantity, name вроде работает quantity увеличиваться не хочет, я где то ошибся или просто не понимаю как работает деструктуризация ?
const cart = {
items: [],
add(product) {
let {items} = this
for (let item of items) {
// let {name, quantity} = item
if (item.name === product.name) {
item.quantity += 1
return
}
}
const newProd = {...product, quantity: 1}
items.push(newProd)
},
}
cart.add({name: 'apple', price: 50})
cart.add({name: 'lemon', price: 60})
cart.add({name: 'lemon', price: 60})
console.log(cart.items)
Ответы (1 шт):
Локальная переменная quantity и поле объекта product.quantity никак не связаны между собой. Если нужно изменить поле объекта надо работать с полем объекта, не его копией.
Хотя оператор a += 1; выглядит как модификация значения объекта a это не так. Этот оператор точная копия выражения a = a + 1;. Выражение a + 1 создаёт новый объект и этот новый объект присваивается старой переменной. Другие переменные, которые ссылались на исходное значение a, продолжат на него ссылаться:
// a
// \
// ---> 1
// /
// b
a += 1;
// a ---> 2
// b ---> 1
Дополнительную путаницу вносит то что есть языки (С++) в которых += может модифицировать объект, а не создавать новую копию. В таких языках a += 1 может, если программист постарается, поменять значение b.
Почитайте про value object. Числа и строки в JavaScript объекты-значения, что здорово облегчает жизнь программисту.
let product = {'quantity': 1};
let {quantity} = product;
console.log('product.quantity', product.quantity);
console.log('quantity', quantity);
quantity += 2;
console.log('product.quantity', product.quantity);
console.log('quantity', quantity);
product.quantity += 3;
console.log('product.quantity', product.quantity);
console.log('quantity', quantity);