basket
имеет несколько ключей, которые можно использовать для поиска значений.Когда кто-то вызывает эту функцию, он вызывает ее с определенным ключом для поиска.Что-то может быть там или нет.Код предполагает, что если что-то есть, то оно, по крайней мере, имеет ключ nbr
.
Если что-то находится в ключе, к этому значению добавляется nbr
(это то, что происходит в else
блок).Если нет, то новое значение должно быть инициализировано там.
Новое значение для хранения в этом ключе инициализируется нестандартным способом: обычно вы используете {}
, а не []
, так как оно используется какассоциативный массив, а не последовательный массив.Но в Javascript последовательный массив на самом деле является просто еще одним видом ассоциативного массива, и поэтому этот код не является неправильным.
Скажем, корзина содержала: { refA: { nbr: 2, price: 3 } }
и кто-то по имени add("refB", 2, 3)
.Вот что произойдет:
- Поиск
refB
в basket
.В корзине нет такого ключа, поэтому результат равен undefined
.Мы входим в блок if
. - Устанавливаем
refB
в basket
в []
.Теперь basket
выглядит следующим образом: { refA: { nbr: 2, price: 3 }, refB: {} }
(Не обращайте внимания на различие между []
и {}
, потому что в этом случае оно вводит в заблуждение.) - Установите ключ
nbr
на новом объекте на 3Это было бы невозможно без объекта для установки ключа, поэтому шаг 2 необходим.Результат теперь выглядит следующим образом: { refA: { nbr: 2, price: 3 }, refB: { nbr: 2 } }
- Наконец, установите
price
для нового объекта.
Надеюсь, это поможет вам понять, как работает код.Наконец, более стандартный способ написания этого кода:
function add(ref,nbr,price){
if (basket[ref] === undefined) {
basket[ref] = { nbr: nbr, price: price }; // The shorthand for this in ES5 and later is { nbr, price }
} else {
basket[ref].nbr += nbr;
}
}