Учитывая этот отрывок 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
самостоятельно.
Можно установить таймер при нажатии или отпускании клавиши и игнорировать события KeyPress и KeyRelease, происходящие в пределах интервала повторения.
-121--1663356-Я думаю, что вам нужно создать маркер с именем пользователя и зашифрованной последовательностью аутентификации, которую вы получите из windows Identity. Не нужно хранить пароль в файле cookie. У нас есть приложение, в котором хранятся имя пользователя и аутентифицированная последовательность
-121--978559-Объяснение см. в оценке короткого замыкания . Это общий способ реализации этих операторов; он не уникален для JavaScript.
Переменные на Javascript не типизируются, поэтому f может быть присвоено целое значение, даже если оно было присвоено с помощью булевых операторов.
f присваивается ближайшее значение, которое равно не эквивалентно false. Таким образом, 0, false, null, undefined, все передается:
alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'
Нет никакой магии. Булевы выражения типа a || b || c || d
оцениваются лениво. Interpeter ищет значение a
, оно не определено, значит ложно, значит, он движется дальше, затем видит b
, которое является нулевым, что все еще дает ложный результат, поэтому он движется дальше, затем видит c
- ту же самую историю. Наконец, он видит d
и говорит: "Да, это не ноль, так что у меня есть результат", и он присваивает его конечной переменной.
Этот трюк будет работать во всех динамических языках, которые делают ленивое короткое замыкание в оценке булевых выражений. В статических языках он не будет компилироваться (ошибка типа). В языках, которые жаждут оценки булевых выражений, он вернет логическое значение (т.е. в данном случае true).
Он оценит X и, если X не равен нулю, пустую строку или 0 (логическое ложь), тогда он назначит его z. Если X имеет значение null, пустая строка или 0 (логическая ложь), то он присваивает y значению z.
var x = '';
var y = 'bob';
var z = x || y;
alert(z);
Будет выводить "bob";
Это сделано для присвоения значения по умолчанию, в данном случае значения y
, если переменная x
является ложной.
Булевы операторы в JavaScript могут возвращать операнд, а не всегда булев результат, как в других языках.
Оператор логического ИЛИ (||
) возвращает значение своего второго операнда, если первый является ложным, иначе возвращается значение первого операнда.
Например:
"foo" || "bar"; // returns "foo"
false || "bar"; // returns "bar"
Ложные значения - это те, которые при использовании в булевом контексте приводят к false
, а это 0
, null
, undefined
, пустая строка, NaN
и, конечно, false
.
Это означает, что если задано x
, значение для z
будет x
, иначе, если y
установлено, тогда его значение будет установлено как значение z
.
это то же самое, что
if(x)
z = x;
else
z = y;
Это возможно, потому что логические операторы в JavaScript не возвращают логические значения, а возвращают значение последнего элемента, необходимого для завершения операции (в предложении ИЛИ это будет первое не ложное значение, в предложении И оно будет последним). Если операция завершилась неудачно, возвращается false
.
Он устанавливает для новой переменной ( z
) значение x
, если оно «правдиво» (ненулевое, допустимый объект / массив / функция / что бы то ни было) или y
в противном случае. Это относительно распространенный способ предоставления значения по умолчанию в случае, если x
не существует.
Например, если у вас есть функция, которая принимает необязательный параметр обратного вызова, вы можете предоставить обратный вызов по умолчанию, который ничего не делает:
function doSomething(data, callback) {
callback = callback || function() {};
// do stuff with data
callback(); // callback will always exist
}
Javacript использует оценку короткого замыкания для логических операторов ||
и &&
. Однако он отличается от других языков тем, что возвращает результат последнего значения, остановившего выполнение, вместо значения true
или false
.
Следующие значения считаются ложными в JavaScript.
""
(пустая строка) Игнорирование правил приоритета операторов и сохранение данных Просто следующие примеры показывают, какое значение остановило оценку и возвращается в результате.
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 и предупреждаем «Извините, у вас нет новых сообщений»
.