Отладка переменной JavaScript
Может кто-нибудь объяснить мне, что делает эта строка кода:
var list = calls[ev] || (calls[ev] = {});
Моя лучшая догадка:
Он устанавливает переменную "список" со значением Call.xxx, где ххх является переменной, ev. Если звонков [ev] не существует, он создает его как пустой объект и присваивает этот пустой объект списку. Это правильно?
Почему используются круглые скобки? Где я могу узнать больше информации об использовании || при установке переменных и использование скобок в этом контексте? Спасибо!
4 ответа
Этот код эквивалентен
var list;
if (calls[ev])
list = calls[ev];
else {
calls[ev] = {};
list = calls[ev];
}
Используются две функции языка:
- Сокращенное вычисление логических выражений (рассмотрим
a || b
, Еслиa
являетсяtrue
затемb
не оценивается). Таким образом, если вы назначаетеvar v = a || b;
а такжеa
оценивает что-то, что может быть приведено кtrue
, затемb
не оценивается. - Оператор присваивания оценивается до последнего назначенного значения (для включения
var a = b = c;
)
Скобки необходимы, чтобы избежать такой интерпретации:
var list = (calls[ev] || calls[ev]) = {};
(что является ошибкой).
Ваше предположение верно. Это распространенный способ объявления значений по умолчанию для переменных в JavaScript.
function foo(bar) {
var bar = bar || 0; //This sets bar to 0 if it's not already set
console.log(bar);
}
Это работает так, что в JavaScript неопределенная переменная является ложной, что означает, что в любой булевой операции сравнения она будет вычисляться как false
, Затем вы можете использовать оператор OR для объединения двух значений, и он вернет первое значение, которое оценивается как true
,
||
или "логическое ИЛИ" имеет более высокий приоритет, чем оператор присваивания =
таким образом, скобки необходимы, чтобы гарантировать, что эта идиома оценивается в правильном порядке
Еще одна вещь, о которой следует знать, это то, что многие языки, включая Javascript, обеспечивают оценку коротких замыканий логических операторов, таких как AND и OR. Если первый операнд логического или оценивает true, нет необходимости оценивать второй операнд, так как это не будет иметь никакого значения для результата.
Поймите это, и вы увидите, что это не какой-то особый синтаксис присваивания, а идиома или шаблон, который использует языковую функцию, чтобы обеспечить более компактное представление идеи.
Вы правы в своем первом предположении. Это общий шаблон для инициализации пространств имен javascript. Он служит для того, чтобы вы не перезаписывали предыдущий объект с тем же именем. Большинство популярных библиотек будут делать что-то подобное для создания своих объектов пространства имен.
Скобка есть, чтобы выражения оценивались в правильном порядке.