Я отлаживаю некоторый JavaScript, и не могу объяснить, что это ||
делает?
function (title, msg) {
var title = title || 'Error';
var msg = msg || 'Error on Request';
}
Может кто-нибудь дать мне подсказку, почему этот парень использует var title = title || 'ERROR'
? Я иногда вижу это и без var
декларации.
javascript
parameters
optional-parameters
or-operator
opHASnoNAME
источник
источник
falsy
, а не простоundefined
. Количество раз, которое я виделdoWeDoIt = doWeDoIt || true
, достаточно, чтобы заставить меня плакать. (то естьdoWeDoIt
теперь никогда не будетfalse
)??
. Javascript оценивает ненулевые объекты, такие какtrue
(или лучше оценивает нулевые объекты как ложные)Ответы:
Это означает, что
title
аргумент не является обязательным. Поэтому, если вы вызываете метод без аргументов, он будет использовать значение по умолчанию"Error"
.Это сокращение для записи:
Этот вид уловки с логическими выражениями также распространен в Perl. С выражением:
он оценивает,
true
если либо,a
либоb
естьtrue
. Так что, еслиa
это правда, вам не нужно проверятьb
вообще. Это называется булевой оценкой короткого замыкания, поэтому:в основном проверяет,
title
оценивает лиfalse
. Если это так, он «возвращается»"Error"
, в противном случае он возвращаетсяtitle
.источник
Что такое оператор двойной трубы (
||
)?Оператор двойной трубы (
||
) является логическимOR
оператором . На большинстве языков это работает следующим образом:false
, оно проверяет второе значение. Если это такtrue
, он возвращается,true
и если это такfalse
, он возвращаетсяfalse
.true
, оно всегда возвращаетсяtrue
, независимо от того, какое второе значение.Так что в основном это работает как эта функция:
Если вы все еще не понимаете, посмотрите на эту таблицу:
Другими словами, это только ложь, когда оба значения ложны.
Чем он отличается в JavaScript?
JavaScript немного отличается, потому что это слабо типизированный язык . В этом случае это означает, что вы можете использовать
||
оператор со значениями, которые не являются логическими. Хотя это не имеет смысла, вы можете использовать этот оператор, например, с функцией и объектом:Что там происходит?
Если значения не являются логическими, JavaScript делает неявное преобразование в логические . Это означает , что если значение falsey (например
0
,""
,null
,undefined
(смотри также все значения falsey в JavaScript )), это будет рассматриваться какfalse
; в противном случае это рассматривается какtrue
.Так что приведенный выше пример должен дать
true
, потому что пустая функция верна. Ну, это не так. Возвращает пустую функцию. Это потому, что||
оператор JavaScript не работает, как я писал в начале. Работает следующим образом:Удивлены? На самом деле, он «совместим» с традиционным
||
оператором. Это можно записать как следующую функцию:Если вы передаете истинное значение как
x
, оно возвращаетx
, то есть истинное значение. Так что, если вы используете его позже вif
пункте:Вы получаете
"Either x or y is truthy."
.Если бы
x
был фальсей,eitherXorY
был быy
. В этом случае вы получите ,"Either x or y is truthy."
еслиy
был truthy; в противном случае вы получите"Neither x nor y is truthy"
.Актуальный вопрос
Теперь, когда вы знаете, как
||
работает оператор, вы, вероятно, сможете сами разобраться, что этоx = x || y
значит. Еслиx
правдиво,x
назначеноx
, так что на самом деле ничего не происходит; в противном случаеy
назначаетсяx
. Обычно используется для определения параметров по умолчанию в функциях. Тем не менее, это часто считается плохой практикой программирования , потому что она не позволяет вам передавать значение Фальси (что не обязательноundefined
илиnull
) в качестве параметра. Рассмотрим следующий пример:Это выглядит актуально с первого взгляда. Тем не менее, что произойдет, если вы передадите в
false
качествеflagA
параметра (поскольку это логическое значение, т. Е. Может бытьtrue
илиfalse
)? Это стало быtrue
. В этом примере нет способа установитьflagA
значениеfalse
.Лучше было бы явно проверить,
flagA
есть лиundefined
, вот так:Хотя он длиннее, он всегда работает и его легче понять.
Вы также можете использовать синтаксис ES6 для параметров функций по умолчанию , но учтите, что он не работает в старых браузерах (например, IE). Если вы хотите поддерживать эти браузеры, вы должны перенести свой код с Babel .
Смотрите также Логические операторы на MDN .
источник
title = title || 'Error'
значитif (title) { title = title; } else { title = 'Error'; }
title ||= 'Error'
.Если заголовок не установлен, используйте «ОШИБКА» в качестве значения по умолчанию.
Более общий:
Читает: Установите Foobar в
foo
илиdefault
. Вы могли бы даже связать это много раз:источник
Объясняя это немного больше ...
||
Оператор является логико -or
оператор. Результат верен, если первая часть верна, и истина, если вторая часть верна, и истина, если обе части верны. Для наглядности вот оно в таблице:Теперь заметить что-то здесь? Если
X
это правда, результат всегда верно. Так что, если мы знаем, чтоX
это правда, нам вообще не нужно проверятьY
. Таким образом, во многих языках реализованы оценщики «короткого замыкания» для логическогоor
(и логическогоand
- другого направления). Они проверяют первый элемент, и если это правда, они вообще не проверяют второй элемент. Результат (в логическом выражении) тот же, но с точки зрения исполнения потенциально огромная разница, если второй элемент дорог для вычисления.Так какое это имеет отношение к вашему примеру?
Давайте посмотрим на это.
title
Элемент передается в вашей функции. В JavaScript, если вы не передаете параметр, по умолчанию используется нулевое значение. Также в JavaScript, если ваша переменная имеет нулевое значение, логические операторы считают ее ложной. Поэтому, если эта функция вызывается с заданным заголовком, это не ложное значение и, таким образом, присваивается локальной переменной. Однако, если ему не дано значение, оно является нулевым значением и, следовательно, ложным. Затем логическийor
оператор вычисляет второе выражение и возвращает вместо него «Ошибка». Теперь локальной переменной присвоено значение «Ошибка».Это работает из-за реализации логических выражений в JavaScript. Он не возвращает правильное логическое значение (
true
илиfalse
), но вместо этого возвращает значение, которое ему было дано согласно некоторым правилам относительно того, что считается эквивалентнымtrue
и что считается эквивалентнымfalse
. Посмотрите свою ссылку на JavaScript, чтобы узнать, что JavaScript считает истинным или ложным в логических контекстах.источник
Двойная труба обозначает логическое «ИЛИ». Это не совсем тот случай, когда «параметр не установлен», так как строго в javascript, если у вас есть такой код:
Тогда звонки
не эквивалентны.
Двойная труба (||) приведёт первый аргумент к логическому значению, и, если полученное логическое значение истинно, выполните присваивание, иначе назначит правильную часть.
Это имеет значение, если вы проверите для неустановленного параметра.
Допустим, у нас есть функция setSalary, у которой есть один необязательный параметр. Если пользователь не предоставляет параметр, то следует использовать значение по умолчанию 10.
если вы делаете проверку, как это:
Это даст неожиданный результат по вызову, как
Это все еще установит 10, следуя описанному выше потоку.
источник
В основном это проверяет, если значение перед || оценивается как true, если да, он принимает это значение, если нет, он принимает значение после ||.
Значения, для которых он будет принимать значение после || (насколько я помню):
источник
Хотя ответ Cletus верен, я чувствую, что нужно добавить больше подробностей в отношении «оценивается как ложное» в JavaScript.
Это не просто проверка наличия заголовка / сообщения, но также и фальсификации любого из них . то есть одно из следующего:
Так в линии
Если title является правдивым (то есть не ложным, поэтому title = "titleMessage" и т. Д.), То логический оператор OR (||) нашел одно значение 'true', что означает, что он оценивается как true, поэтому он замыкается и возвращает истинное значение (название).
Если title является ложным (то есть одним из списка выше), тогда логический оператор OR (||) нашел значение «false» и теперь должен оценить другую часть оператора, «Error», которая оценивается как true и, следовательно, возвращается.
Также может показаться (после некоторых быстрых экспериментов с консолью firebug), что обе стороны оператора оценивают как false, он возвращает второй оператор 'ложь'.
т.е.
возвращает undefined, возможно, это позволяет вам использовать поведение, о котором идет речь в этом вопросе, при попытке установить заголовок / сообщение по умолчанию в "". т.е. после бега
Foo будет установлен на ""
источник
оператор двойной трубы
этот пример полезен?
так же может быть
источник
Чтобы добавить некоторые объяснения ко всему сказанному до меня, приведу несколько примеров для понимания логических понятий.
Это означает, что если левая сторона оценена как истинная инструкция, она будет завершена, а левая сторона будет возвращена и присвоена переменной. в других случаях правая сторона будет возвращена и назначена.
И оператор имеет противоположную структуру, как показано ниже.
источник
|| является логическим оператором ИЛИ Как и в JavaScript, undefined, null, 0, false считаются ложными значениями.
Это просто значит
источник
Цитата: «Что означает конструкция x = x || y?»
Назначение значения по умолчанию.
Это означает предоставление значения по умолчанию от y до x , если x все еще ожидает своего значения, но еще не получил его или был намеренно опущен, чтобы вернуться к значению по умолчанию.
источник
function getKeys(x) { x = x || this ; .... }
который может быть использован без модификации в качестве отдельной функции, как метод свойства в прототипах и как метод элемента, который может получить другой элемент в качестве аргумента в виде `[element] .getKeys (anotherElement);`И я должен добавить еще одну вещь: эта стенография - мерзость. Это неправильно использует случайную оптимизацию интерпретатора (не заботясь о второй операции, если первая верна), чтобы управлять назначением. Это использование не имеет ничего общего с целью оператора. Я не верю, что это должно когда-либо использоваться.
Я предпочитаю троичный оператор для инициализации, например,
Это использует однострочную условную операцию для ее правильного назначения. Он все еще играет неприглядные игры с правдивостью, но это Javascript для вас.
источник