деструктуризация

в цикле если раскоментить деструктуризацию и удалить ниже 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 шт):

Автор решения: Stanislav Volodarskiy

Локальная переменная 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);

→ Ссылка