Отладка переменной JavaScript - PullRequest
10 голосов
/ 06 марта 2012

Пожалуйста, кто-нибудь может объяснить мне, что делает эта строка кода:

var list  = calls[ev] || (calls[ev] = {});

Мое лучшее предположение:

Это установка переменной "list" со значением Call.xxx,где xxx - переменная, ev.Если call [ev] не существует, он создает его как пустой объект и присваивает этот пустой объект списку.Это правильно?

Почему используются круглые скобки?Где я могу узнать больше информации об использовании ||при установке переменных и использование скобок в этом контексте?Спасибо!

Ответы [ 4 ]

11 голосов
/ 06 марта 2012

Этот код эквивалентен

var list;
if (calls[ev])
  list = calls[ev];
else {
  calls[ev] = {};
  list = calls[ev];
}

Используются две функции языка:

  1. Сокращение логических выражений (рассмотрим a || b. Если a равно true, то b не оценивается). Таким образом, если вы присваиваете var v = a || b; и a оценивает что-то, что может быть приведено к true, то b не оценивается.
  2. Оператор присваивания оценивается до последнего присвоенного значения (для включения var a = b = c;)

В скобках необходимо избегать такой интерпретации:

var list = (calls[ev] || calls[ev]) = {};

(что является ошибкой).

6 голосов
/ 06 марта 2012

Ваше предположение верно. Это распространенный способ объявления значений по умолчанию для переменных в JavaScript.

function foo(bar) {
    var bar = bar || 0; //This sets bar to 0 if it's not already set
    console.log(bar);
}

Способ, которым это работает, заключается в том, что в JavaScript неопределенная переменная является ложной, что означает, что в любой булевой операции сравнения она будет иметь значение false. Затем вы можете использовать оператор ИЛИ для объединения двух значений, и он вернет первое значение, которое оценивается как true.

1 голос
/ 06 марта 2012

Вы правы в своем первом предположении.Это общий шаблон для инициализации пространств имен javascript.Он служит для того, чтобы вы не перезаписывали предыдущий объект с тем же именем.Большинство популярных библиотек будут делать что-то похожее для создания своих объектов пространства имен.

Здесь есть скобки, чтобы выражения оценивались в правильном порядке.

1 голос
/ 06 марта 2012

|| или «логическое ИЛИ» имеет более высокий приоритет , чем оператор присваивания =, поэтому скобки необходимы для того, чтобы эта идиома оценивалась в правильном порядке

Другая вещь, о которой следует знать, это то, что многие языки, включая Javascript, обеспечивают оценку короткого замыкания логических операторов, таких как AND и OR. Если первый операнд логического или оценивает true, нет необходимости оценивать второй операнд, так как это не будет иметь никакого значения для результата.

Поймите это, и вы увидите, что это не какой-то особый синтаксис присваивания, а идиома или шаблон, который использует языковые возможности для более компактного представления идеи.

...