Я заметил в Javascript, я иногда видел
var foo = bar && bar.getSomething()
Я знаю, что это, вероятно, похоже на:
var foo;
if(bar !== undefined) {
foo = bar.getSomething();
}
Но это все еще меня смущает. Потому что для меня это очень похоже на двоичную операцию, такую как:
0100 & 0101 == 0100; //true
Тем не менее, это совсем другое с другой стороны, потому что, например, если bar является объектом, а bar.getSomething() возвращает целое число (говоря в следующем примере 5), и код заканчивается как:
var foo = {baz : qux} && 5;
для меня это явно не имеет смысла.
Итак, мой вопрос в том, почему в Javascript люди могут кодировать таким образом? Является ли это реализацией двоичной операции в JS? Как называется эта практика кодирования? есть ли преимущество в производительности по сравнению с традиционным способом? Спасибо
Я думаю, что вы запутались между оператором & и оператором &&, оператор & будет возвращать побитовое &, а оператор && возвращает последний операнд, если все значения истинны или первое значение ложности, если какое-либо из значений является ложным
console.log(4 & 5);
console.log(4 && 5);
console.log(!!(4 && 5));
console.log(0 && 5);
console.log(5 && 0);
console.log(null && 5);
console.log(5 && null);
вы можете использовать !! оператора, чтобы убедиться, что он является логическим
false
только если один из операндов false
.
&&
является логическим И, а не побитовым И.is there any performance benefit compared to the traditional way?
Скорее всего нет, движки Javascript довольно умны в наши дни, такие микрооптимизации обычно ничего не дают. Основное использование - просто сделать код короче, это в основном говорит, продолжайте выполнять слева, пока что-то не вернет false. Вы можете связать их больше, чем просто 2, например .. action1 && action2 && action3, если action2 вернул false, action3 не будет выполнен.