Вопрос

Учитывая этот фрагмент JavaScript...

var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';

var f = a || b || c || d || e;

alert(f); // 4

Может кто-нибудь объяснить мне, как называется эта техника (лучше всего предположить, что это заголовок этого вопроса!)?И как/почему именно это работает?

Насколько я понимаю, эта переменная f будет присвоено ближайшее значение (слева направо) первой переменной, значение которой не равно нулю или неопределенному, но мне не удалось найти много справочных материалов об этом методе, и я видел, как он часто используется .

Кроме того, является ли этот метод специфичным для JavaScript?Я знаю, что выполнение чего-то подобного в PHP приведет к f имеющее истинное логическое значение, а не значение d сам.

Это было полезно?

Решение

Видеть оценка короткого замыкания для объяснения.Это распространенный способ реализации этих операторов;это не уникально для JavaScript.

Другие советы

Это сделано для назначения значение по умолчанию, в этом случае значение y, если x переменная ложный.

Логические операторы в JavaScript могут возвращать операнд, а не всегда логический результат, как в других языках.

Логический оператор ИЛИ (||) возвращает значение своего второго операнда, если первый операнд ложный, в противном случае возвращается значение первого операнда.

Например:

"foo" || "bar"; // returns "foo"
false || "bar"; // returns "bar"

Ложный ценности – это те, кто принуждает false при использовании в логическом контексте, и они 0, null, undefined, пустая строка, NaN и конечно false.

Javascript использует оценка короткого замыкания для логических операторов || и &&. Однако он отличается от других языков тем, что возвращает результат последнего значения, остановившего выполнение, вместо true, или false ценить.

Следующие значения считаются ложными в JavaScript.

  • ЛОЖЬ
  • нулевой
  • "" (пустая строка)
  • 0
  • Нэн
  • неопределенный

Игнорируя приоритет оператора правил и для простоты, следующие примеры показывают, какое значение остановило вычисление и какое значение возвращается в результате.

false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"

Первые 5 значений до NaN являются ложными, поэтому все они оцениваются слева направо, пока не достигнут первого истинного значения - "Hello" что делает все выражение истинным, поэтому все, что находится дальше, не будет оцениваться, и "Hello" возвращается в результате выражения.Аналогично в этом случае:

1 && [] && {} && true && "World" && null && 2010 // null

Все первые 5 значений правдивы и оцениваются до тех пор, пока не встретится первое ложное значение (null), что делает выражение ложным, поэтому 2010 больше не оценивается, и null возвращается в результате выражения.

В приведенном вами примере используется это свойство JavaScript для выполнения присваивания.Его можно использовать везде, где вам нужно получить первое истинное или ложное значение среди набора значений.Этот код ниже присвоит значение "Hello" к b поскольку это упрощает присвоение значения по умолчанию вместо выполнения проверок if-else.

var a = false;
var b = a || "Hello";

Вы можете назвать приведенный ниже пример использованием этой функции, и я считаю, что это усложняет чтение кода.

var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);

Внутри оповещения мы проверяем, messages является ложным, и если да, то оцените и верните noNewMessagesText, в противном случае оцените и верните newMessagesText.Поскольку в этом примере это неверно, мы останавливаемся на noNewMessagesText и предупреждаем "Sorry, you have no new messages.".

Переменные Javascript не типизированы, поэтому f может быть присвоено целочисленное значение, даже если оно было присвоено с помощью логических операторов.

f присваивается ближайшее значение, которое не эквивалентно ложному.Таким образом, все значения 0, false, null, undefined игнорируются:

alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'

В этом нет никакой магии.Логические выражения, такие как a || b || c || d лениво оцениваются.Интерпретатор ищет значение a, оно не определено, поэтому оно ложно, поэтому оно движется дальше, а затем видит b который равен нулю, что все равно дает ложный результат, поэтому он движется дальше, а затем видит c - та же история.Наконец он видит d и говорит: «Да, это не ноль, поэтому у меня есть результат» и присваивает его последней переменной.

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

Этот вопрос уже получил несколько хороших ответов.

Подводя итог, можно сказать, что этот метод использует особенность компиляции языка.То есть JavaScript «замыкает» вычисление логических операторов и возвращает значение, связанное либо с первым неложным значением переменной, либо с тем, что содержит последняя переменная.См. объяснение Анурага о тех значениях, которые будут оценены как ложные.

Использование этого метода не является хорошей практикой по нескольким причинам;однако.

  1. Читабельность кода:Здесь используются логические операторы, и если поведение компиляции непонятно, то ожидаемым результатом будет логическое значение.
  2. Стабильность:При этом используется особенность компиляции языка, которая несовместима для разных языков, и поэтому потенциально это может быть изменено в будущем.
  3. Документированные возможности:Существует существующая альтернатива, которая удовлетворяет эту потребность и совместима с большим количеством языков.Это будет тернарный оператор:

    () ?значение 1:Значение 2.

Использование тернарного оператора требует немного больше ввода, но он четко различает вычисляемое логическое выражение и присваиваемое значение.Кроме того, его можно объединить в цепочку, чтобы можно было воссоздать типы назначений по умолчанию, выполняемые выше.

var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';

var f =  ( a ) ? a : 
                ( b ) ? b :
                       ( c ) ? c :
                              ( d ) ? d :
                                      e;

alert(f); // 4

Обратный вывод первое истинное значение.

Если все ложные, верните последнее ложное значение.

Пример:-

  null || undefined || false || 0 || 'apple'  // Return apple

Он устанавливает новую переменную (z) либо к значению x если это «правдиво» (ненулевое значение, действительный объект/массив/функция/что бы это ни было) или y в противном случае.Это относительно распространенный способ предоставления значения по умолчанию в случае, если x не существует.

Например, если у вас есть функция, которая принимает необязательный параметр обратного вызова, вы можете предоставить обратный вызов по умолчанию, который ничего не делает:

function doSomething(data, callback) {
    callback = callback || function() {};
    // do stuff with data
    callback(); // callback will always exist
}

Это означает, что если x установлено, значение для z будет x, в противном случае, если y установлено, то его значение будет установлено как zзначение.

это то же самое, что

if(x)
  z = x;
else
  z = y;

Это возможно, потому что логические операторы в JavaScript возвращают не логические значения, а значение последнего элемента, необходимого для завершения операции (в предложении OR это будет первое значение, не являющееся ложным, в предложении AND оно будет последним). ).Если операция не удалась, то false возвращается.

Это называется оператор короткого замыкания.

Сокращенная оценка гласит, что второй аргумент выполняется или оценивается только в том случае, если первого аргумента недостаточно для определения значения выражения.когда первый аргумент функции ИЛИ (||) имеет значение true, общее значение должно быть true.

Его также можно использовать для установки значения по умолчанию для аргумента функции.`

function theSameOldFoo(name){ 
  name = name || 'Bar' ;
  console.log("My best friend's name is " + name);
}
theSameOldFoo();  // My best friend's name is Bar
theSameOldFoo('Bhaskar');  // My best friend's name is Bhaskar`

Он оценит X и, если X не равен нулю, пустую строку или 0 (логическое ложь), затем присвоит ее z.Если X имеет значение NULL (пустая строка) или 0 (логическое ложь), тогда y будет присвоено z.

var x = '';
var y = 'bob';
var z = x || y;
alert(z);

Выведет «боб»;

Согласно Блог Билла Хиггинса почта; идиома логического ИЛИ присваивания Javascript (февраль.2007), такое поведение справедливо начиная с версии 1.2 (по крайней мере)

Он также предлагает другое его использование (цитата):"облегченная нормализация межбраузерных различий"

// determine upon which element a Javascript event (e) occurred
var target = /*w3c*/ e.target || /*IE*/ e.srcElement;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top