Отладка переменной 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];
}

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

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

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

Другие вопросы по тегам