Учитывая этот фрагмент 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
себя.
$f=$a or $f=$b or $f=$c; // etc
. В PHP есть||
оператор иor
оператор, которые выполняют одну и ту же работу; однакоor
оценивается после присвоения, в то время||
как оценивается до. Это также даст вам стиль$a=getSomething() or die('oops');
$f = $a ?: $b ?: $c;
??
для этого.$a = $b ?? 'default'
$a
будет ли присвоено значение$b
if$b
true, other'default'
?Ответы:
См. Оценку короткого замыкания для объяснения. Это распространенный способ реализации этих операторов; это не уникально для JavaScript.
источник
if( true == f )
. Если целое число было сохранено в f, то этот тест всегда будет возвращать false.if(true == f)
, что так же, какif(f)
: тест пройдет. Если вы хотите , чтобы также проверить тип изf
, использовать строгое сравнение:if(true === f)
, который подведет действительно.Это сделано для присвоения значения по умолчанию , в данном случае значения
y
, еслиx
переменная ложная .Логические операторы в JavaScript могут возвращать операнд, а не всегда логический результат, как в других языках.
Оператор логического ИЛИ (
||
) возвращает значение своего второго операнда, если первый является ложным, в противном случае возвращается значение первого операнда.Например:
Falsy значения являются те , которые принуждают к
false
при использовании в логическом контексте, и они0
,null
,undefined
, пустая строка,NaN
и, конечно жеfalse
.источник
||
эксклюзив.&&
оператор имеет аналогичное поведение, он возвращает значение первого операнда, если он сам по себе ложный, и возвращает значение второго операнда, только если первый операнд верен , например,("foo" && "bar") == "bar"
и(0 && "bar") == 0
Javacript использует оценку короткого замыкания для логических операторов
||
и&&
. Однако он отличается от других языков тем, что возвращает результат последнего значения, остановившего выполнение, вместо значенияtrue
илиfalse
.Следующие значения считаются ложными в JavaScript.
""
(пустой строкой)Игнорируя правила приоритета операторов и сохраняя простоту, следующие примеры показывают, какое значение остановило оценку и в результате возвращается.
Первые 5 значений
NaN
являются ложными, поэтому все они оцениваются слева направо до тех пор, пока оно не встретит первое истинное значение -"Hello"
что делает все выражение истинным, поэтому все дальнейшее повышение не будет оцениваться и"Hello"
будет возвращено в результате выражения , Аналогично в этом случае:Первые 5 значений являются достоверными и оцениваются до тех пор, пока не встретятся первое ложное значение (
null
), которое делает выражение ложным, поэтому2010
больше не оценивается иnull
возвращается в результате выражения.В приведенном вами примере используется это свойство JavaScript для выполнения назначения. Он может использоваться где угодно, где вам нужно получить первое истинное или ложное значение среди набора значений. Этот код ниже будет присвоить значение ,
"Hello"
чтобы ,b
как это делает его легче присвоить значение по умолчанию, вместо того , чтобы делать if-другую проверку.Вы можете назвать приведенный ниже пример использованием этой функции, и я считаю, что это затрудняет чтение кода.
Внутри оповещения мы проверяем,
messages
является ли ложным, и если да, то оцениваем и возвращаемnoNewMessagesText
, иначе оцениваем и возвращаемnewMessagesText
. Поскольку в этом примере это ложно, мы останавливаемся на noNewMessagesText и предупреждаем"Sorry, you have no new messages."
.источник
However, it's different to other languages in that it returns the result of the last value that halted the execution, instead of a true, or false value.
Переменные Javascript не являются типизированными, поэтому f можно присвоить целочисленное значение, даже если оно было назначено с помощью логических операторов.
F присваивается ближайшее значение, которое не эквивалентно ложному . Итак, 0, false, null, undefined, все передаются:
источник
''
также равный false в этом случае.f is assigned the NEAREST value
что здесь очень важно.||
оператор, будучи логическим оператором, имеет два операнда: левую и правую стороны. Если левая сторона||
является truthy , операция рассасывается к левой стороне и правой стороне игнорируются. Если левая сторона ложная , она переходит в правую сторону. Так что наnull || undefined || 4 || 0
самом деле решает,undefined || 4 || 0
что решает,4 || 0
что решает, чтобы4
.В этом нет никакой магии. Булевы выражения вроде
a || b || c || d
лениво оцениваются. Interpeter ищет значениеa
, оно не определено, поэтому оно ложно, поэтому оно движется дальше, затем оно видит,b
какое значение равно нулю, что все еще дает ложный результат, поэтому оно движется дальше, а затемc
- ту же историю. Наконец, он видитd
и говорит «да, это не нуль, поэтому у меня есть результат», и он присваивает его конечной переменной.Этот прием будет работать во всех динамических языках, которые лениво оценивают логические выражения при коротком замыкании. В статических языках он не будет компилироваться (ошибка типа). В языках, которые стремятся оценить логические выражения, он вернет логическое значение (т. Е. В данном случае true).
источник
d
будет назначен независимо от того, был он нулевым или неопределенным или нет.||
оператор всегда разрешает весь операнд правой стороны, когда левая сторона ложная. Будучи логическим оператором, он видит только два входа: левую и правую стороны. Парсер не видит их как последовательность терминов, поэтому он фактически не останавливается, когда находит первое истинное значение, если только это значение не является левым операндом другого||
.Этот вопрос уже получил несколько хороших ответов.
Таким образом, этот метод использует возможность компилирования языка. То есть JavaScript «закорачивает» оценку булевых операторов и возвращает значение, связанное либо с первым непустым значением переменной, либо с тем, что содержит последняя переменная. См. Объяснение Анурага тех ценностей, которые будут оцениваться как ложные.
Использование этой техники не является хорошей практикой по нескольким причинам; Однако.
Документированные функции: существует альтернатива, которая удовлетворяет эту потребность и совместима с другими языками. Это будет троичный оператор:
()? значение 1: значение 2.
Использование тернарного оператора требует немного большего набора текста, но оно четко различает оцениваемое логическое выражение и назначаемое значение. Кроме того, он может быть объединен в цепочку, поэтому типы назначений по умолчанию, выполняемые выше, могут быть воссозданы.
источник
potentially be targeted for change in the future.
да, но это не относится к javascript.a || b || c || d || e
?Вернуть вывод первого истинного значения .
Если все ложно, вернуть последнее ложное значение.
Пример:-
источник
Он устанавливает новую переменную (
z
) либо в значениеx
«истинно» (не ноль, допустимый объект / массив / функция / что бы то ни было) илиy
иное. Это относительно распространенный способ предоставления значения по умолчанию на случай, еслиx
его не существует.Например, если у вас есть функция, которая принимает необязательный параметр обратного вызова, вы можете предоставить обратный вызов по умолчанию, который ничего не делает:
источник
Это означает, что если
x
установлено, значение дляz
будетx
, в противном случае, еслиy
установлено, то его значение будет установлено какz
значение.это так же, как
Это возможно, потому что логические операторы в JavaScript не возвращают логические значения, но значение последнего элемента, необходимого для завершения операции (в предложении ИЛИ это будет первое не ложное значение, в предложении И это будет последнее ). Если операция не выполняется,
false
возвращается.источник
||
оператор просто возвращает второе значение, независимо от того, верно оно или нет.z
устанавливается значение,x
если это значение является достоверным . В противном случае он устанавливается на значениеy
. Это означает, что еслиx
установлено, например,0
или пустая строка""
, это не будет делать то, что вы говорите, так как эти значения ложные .Это называется оператор короткого замыкания.
Оценка короткого замыкания говорит, что второй аргумент выполняется или оценивается, только если первого аргумента недостаточно для определения значения выражения. когда первый аргумент функции OR (||) оценивается как true, общее значение должно быть true.
Его также можно использовать для установки значения по умолчанию для аргумента функции.
источник
Он будет оценивать X и, если X не равен NULL, пустой строке или 0 (логическое ложное значение), то он назначит его z. Если X - ноль, пустая строка или 0 (логическое ложь), тогда он назначит y для z.
Будет выводить «Боб»;
источник
false
, но пустые массивы или объекты приводят кtrue
.Согласно сообщению в блоге Билла Хиггинса ; идиома логического ИЛИ назначения Javascript (февраль 2007 г.), это поведение верно с версии 1.2 (по крайней мере)
Он также предлагает другое использование для этого (цитируется): « облегченная нормализация различий между браузерами »
источник