Каково точное значение этого кода с помощью || ("ИЛИ") оператор? - PullRequest
2 голосов
/ 18 апреля 2011

Я где-то видел этот фрагмент кода:

var idx = SOME_VALUE;

var color = {
  yellor: 1,
  red: 2,
  black: 0
};

var x = color[idx] || []; // Is this means if color[idx] is null, then return an empty array?

Я могу только догадываться, что код var x = color[idx] || []; означает, что если color[idx] равно нулю, то вернуть пустой массив в x, иначе x = color [idx]. Я прав?

И все же мне нужно объяснение. Этот код имеет ту же логику, что и следующая?

CONDITION==VALUE? TRUE_goes_here : FALSE_goes_here

Ответы [ 5 ]

4 голосов
/ 18 апреля 2011

Это означает, что если color[idx] является "ложным", используйте вместо него пустой массив. «Ложные» значения: false (конечно), 0, NaN, "", undefined и null (все остальные значения являются «достоверными»). Эта идиома является примером необычайно мощного || оператора JavaScript *.

.

В этом случае он предоставляет значение по умолчанию, если color не содержит свойство с именем, содержащимся в idx (потому что, когда вы индексируете такой объект, а ключ не соответствует ни одному существующему свойству имя, результат будет undefined): x будет 1 (если idx - "вопль"), 2 (если idx - "красный"), 0 (если idx "черный") или [], если idx - это что-то еще.

Итак, отвечая на ваш вопрос в конце вашего вопроса, в основном, да. Это:

var x = color[idx];
if (!x) {
    x = [];
}

или

var x = color[idx] ? color[idx] : [];

* (Это пост в моем маленьком анемичном блоге.)

1 голос
/ 18 апреля 2011

Вы правы.

В Javascript a || b соответствует первому «истинному» операнду.
Если a является «ложным» (например, null, false,undefined, 0), будет оценено как b.

0 голосов
/ 18 апреля 2011

В этом случае || является оператором «логическое значение» или «логическое значение». Как и во многих языках, логические операторы в JavaScript закорочены. Например, предположим, что у меня есть следующее логическое выражение:

var booleanValue = someFunction() || otherFunction()

Если возвращаемое значение первой функции является истинно-эквивалентным, нет необходимости оценивать второе значение, и otherFunction() не будет выполняться, потому что оператор "или" возвращает истинно-эквивалентное значение, независимо от того, является ли какая-то из его оперированных истинно-эквивалент. Это хорошо, потому что делает ваш код более эффективным: оценивается только нужное выражение.

Кроме того, в этом случае наблюдается любопытное поведение: поскольку первое значение выражения является истинно-эквивалентным, JavaScript просто возвращает его как результат выражения, потому что это в любом случае означало бы, что все выражение истинно.

В вашем коде значение color[idx] является истинно-эквивалентным, если оно установлено. Поскольку в операции «или» это значение равнозначно истинному значению, оно возвращается как значение выражения. Однако, если он не установлен, возвращается undefined, что является ложно-эквивалентным значением. Таким образом, JavaScript должен оценить следующее значение, чтобы определить, является ли выражение «или» истинным. Поскольку следующее значение является последним и значение выражений полностью зависит от него, выражение возвращает следующее значение, если первое является ложно-эквивалентным.

0 голосов
/ 18 апреля 2011
var x = color[idx] || [];

Если color - это объект со свойством, имя которого равно String(idx), а значение этого свойства истинно, присвойте значение этого свойства x. В противном случае, пусть x будет пустым массивом.

0 голосов
/ 18 апреля 2011

Оператор или || выдаст вам первое значение, которое не оценивается как условие false (например, 0 или null do).

Это означает, что использование 0 || null || 5 даст 5 в результате.

То, что у вас есть в этом коде, является обычной практикой в ​​JavaScript, в которой оператор || используется для указания значений по умолчанию при инициализации переменной. Это только потому, что

var x = something || default_value;

немного читабельнее, чем

var x = (something ? something : default_value);
...