быстрый вопрос о переменных JavaScript - PullRequest
2 голосов
/ 30 августа 2011

Не уверен, что искать здесь, поэтому прошу прощения, если я повторяю другой вопрос.

Мне интересно, есть ли какие-либо проблемы, о которых я не знаю с использованием следующего синтаксиса в JavaScript:

var a = {};

var b = a.niceCoat = {};

Кажется, удобно, но я просто хочу убедиться ...

Ответы [ 5 ]

11 голосов
/ 30 августа 2011

Это прекрасно, потому что 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] = {});

(хотя он может быть менее читаемым).

4 голосов
/ 30 августа 2011

Вы можете сделать это.a.niceCoat = {} будет оцениваться первым, что назначает объект свойству, а также имеет объект в качестве результата, который затем можно назначить переменной.

Однако вы должны знать, что b и a.niceCoat теперь ссылаются на один и тот же объект, поэтому, если вы поместите что-либо в объект, оно будет отображаться как для переменной, так и для свойства:

var a = {};
var b = a.niceCoat = {};

b.x = 42;
alert(a.niceCoat.x); // shows 42
1 голос
/ 30 августа 2011

С этим проблем нет.Это то же самое, что и

var b = (a.niceCoat = {});

То же самое, что и:

a.niceCoat = {};
var b = a.niceCoat; // Now b and a.niceCoat are the same object

Просто будьте осторожны с объявлением совершенно новых переменных, например:

var i = j = 0;

Что аналогично:

j = 0;
var i = j;

Обратите внимание, что j не объявлено с ключевым словом var.

0 голосов
/ 30 августа 2011

Да, абсолютно верно.

Например,

var a = {};

var b = a.niceCoat = {};

a.foo = function() { alert('foo!'); };


a.foo(); // shows the alert
0 голосов
/ 30 августа 2011

это то, как вы создаете пустой объект в JavaScript.в этом нет ничего плохого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...