Это делает это:
- Оценка
obj[letter]
(подробнее об этом ответы на этот вопрос ): - Оценка
letter
, чтобы получить еготекущее значение (например, "a"
) - Оценка
obj
для получения его текущего значения (объекта) - Получение значения свойства с именем
"a"
(например) впредмет;если свойство не существует, результатом будет значение undefined
- Разветвление в
if
, если значение из шага 1 равно truey
A truey значение - это любое значение, которое не falsy .Ложные значения: undefined
, null
, 0
, ""
, NaN
и, конечно, false
.
В основном то, что делает этот код, видит, если obj
уже имеет свойство для письма и, если это так, увеличивает его значение;в противном случае он устанавливает его значение равным 1.
Однако не слишком обобщайте этот шаблон.Это работает здесь, потому что значение свойства никогда не будет 0
или ""
или подобным (сохраняемые значения начинаются с 1 и только увеличиваются).Но в других ситуациях, если вам нужно проверить, существует ли свойство у объекта, но его значение может быть одним из этих ложных значений, используйте либо obj.hasOwnProperty(letter)
(чтобы проверить, существует ли свойство на самом объекте, а не на его прототипе), letter in obj
, если вы хотите проверить объект и его цепочку прототипов, или если вы хотите быть параноиком по поводу переопределения hasOwnProperty
, используйте Object.prototype.hasOwnProperty.call(obj, letter)
.: -)
Но эта «ложная» проверка очень полезна, когда вы знаете, что свойства либо там не будет, либо оно имеет истинное значение.