JavaScript ИЛИ (||) переменное объяснение присвоения

Учитывая этот отрывок 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 самостоятельно.

332
задан Bergi 21 October 2015 в 23:15
поделиться

8 ответов

Можно установить таймер при нажатии или отпускании клавиши и игнорировать события KeyPress и KeyRelease, происходящие в пределах интервала повторения.

-121--1663356-

Я думаю, что вам нужно создать маркер с именем пользователя и зашифрованной последовательностью аутентификации, которую вы получите из windows Identity. Не нужно хранить пароль в файле cookie. У нас есть приложение, в котором хранятся имя пользователя и аутентифицированная последовательность

-121--978559-

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

202
ответ дан 23 November 2019 в 00:45
поделиться

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

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

alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'
48
ответ дан 23 November 2019 в 00:45
поделиться

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

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

29
ответ дан 23 November 2019 в 00:45
поделиться

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

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

Будет выводить "bob";

0
ответ дан 23 November 2019 в 00:45
поделиться

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

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

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

Например:

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

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

181
ответ дан 23 November 2019 в 00:45
поделиться

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

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

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

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

1
ответ дан 23 November 2019 в 00:45
поделиться

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

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

function doSomething(data, callback) {
    callback = callback || function() {};
    // do stuff with data
    callback(); // callback will always exist
}
4
ответ дан 23 November 2019 в 00:45
поделиться

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

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

  • false
  • null
  • "" (пустая строка)
  • 0
  • Nan
  • undefined

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

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

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

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

Первые 5 значений все истинны и оцениваются до тех пор, пока не встретят первое ложное значение ( null ), что делает выражение ложным, поэтому 2010 isn 'больше не вычисляется, и 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);

Внутри предупреждения мы проверяем, являются ли сообщения ложными, и если да, то оцениваем и возвращаем noNewMessagesText , в противном случае оцениваем и возвращаем newMessagesText . Поскольку в этом примере это ложь, мы останавливаемся на noNewMessagesText и предупреждаем «Извините, у вас нет новых сообщений» .

159
ответ дан 23 November 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: