Это прекрасно, потому что a
было объявлено ранее.Выражения будут оцениваться как
var a = {};
var b = (a.niceCoat = {});
Т.е. сначала он присваивает новый пустой объект a.niceCoat
, а результат (результатом присваивания является присвоенное значение) - b
.
Но имейте в виду что-то вроде
var a = b = 'c';
, которое, опять же, оценивается как
var a = (b = 'c');
Только a
будет находиться в локальной области видимости, b
будет глобальный .Если вы хотите, чтобы b
также был локальным, вы должны объявить это заранее: var b;
.Что-то вроде var a = var b = ....
работает не работает (неверный синтаксис).
Немного не по теме:
Этот метод действительно удобен,Представьте, что у вас есть объект объектов, например:
var map = {
foo: {},
bar: {}
};
, и вы хотите получить объект для определенного ключа или создать новый, если ключ не существует.Обычно это можно сделать следующим образом:
var obj = map[key];
if(!obj) { // works because if the key is set, it is an object
obj = {}; // which evals to true
map[key] = obj;
}
// now work with obj
С помощью описанного выше метода его можно сократить до
var obj = map[key];
if(!obj) {
map[key] = obj = {};
}
. И мы можем сделать его еще короче с помощью логического оператора ИЛИ (||
) :
var obj = map[key] || (map[key] = {});
(хотя он может быть менее читаемым).