Javascript И оператор в присваивании

Я знаю, что в JavaScript вы можете сделать:

var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...";

где переменная oneOrTheOther примет значение первого выражения, если оно не null, undefined, или же false, В этом случае ему присваивается значение второго оператора.

Тем не менее, что делает переменную oneOrTheOther получить назначение, когда мы используем логический оператор И?

var oneOrTheOther = someOtherVar && "some string";

Что будет, когда someOtherVar это не ложь?
Что будет, когда someOtherVar ложно?

Просто изучаю JavaScript, и мне любопытно, что произойдет с присваиванием в сочетании с оператором AND.

7 ответов

Решение

В основном оператор логического И (&&), вернет значение второго операнда, если первый верный, и вернет значение первого операнда, если он сам по себе ложный, например:

true && "foo"; // "foo"
NaN && "anything"; // NaN
0 && "anything";   // 0

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

&& иногда называется оператором охраны.

variable = indicator && value

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

Пример для начинающих

Если вы пытаетесь получить доступ к "user.name", но тогда это происходит:

Uncaught TypeError: Cannot read property 'name' of undefined 

Не бойся. Вы можете решить эту проблему, используя оператор && в назначении или часто называемый оператором guard, поскольку он "защищает" от возникновения неопределенной ошибки.

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

var user = undefined;
var username = user && user.username;
// no error, "username" assigned value of "user" which is undefined

user = { username: 'Johnny' };
username = user && user.username;
// no error, "username" assigned 'Johnny'

user = { };
username = user && user.username;
// no error, "username" assigned value of "username" which is undefined

Пояснение: В операции охраны каждый член оценивается слева направо по одному. Если оцененное значение является ложным, оценка останавливается, и это значение затем присваивается. Если достигнут последний элемент, ему присваивается, является ли он ложным.

фальсификация означает, что это одно из этих значений undefined, false, 0, null, NaN, '' и правда просто означает НЕ ложь.

Простая кнопка для метода охраны

Используйте прекрасный оператор lodash для доступа к вложенным данным, например:

// need to access obj.has.some.very.nested.stuff
var val = _.get(obj, 'has.some.very.nested.stuff');

так как он обрабатывает содержимое && под капотом, в то же время его удобно использовать удобным способом. Lodash _.get исходный код

Бонус: оператор ИЛИ

Другое полезное странное назначение, которое используется на практике, это оператор ИЛИ, который обычно используется для плагинов, например так:

this.myWidget = this.myWidget || (function() {
   // define widget
})();

который назначит только часть кода, если "this.myWidget" ложно. Это удобно, потому что вы можете объявить код где угодно и несколько раз, не заботясь о том, был ли он назначен или нет ранее, зная, что он будет назначен только один раз, так как люди, использующие плагин, могут случайно объявить ваш тег script src несколько раз.

Объяснение: Каждое значение оценивается слева направо, по одному за раз. Если значение истинно, оно останавливает оценку и присваивает это значение, в противном случае продолжает работать, если достигнут последний элемент, оно назначается независимо от того, ложно оно или нет.

Дополнительный кредит: объединение && и || в назначении

Теперь вы обладаете абсолютной силой и можете делать очень странные вещи, такие как этот очень странный пример использования его на палиндроме.

function palindrome(s,i) {
 return (i >= s.length/2) || (s[i] === s[s.length -1 - i]) && palindrome(s, ++i);
}

Подробное объяснение здесь: проверка палиндрома в Javascript

Удачного кодирования.

Цитируя Дугласа Крокфорда1:

&& Оператор выдает значение своего первого операнда, если первый операнд ложный. В противном случае он производит значение второго операнда.


1 Дуглас Крокфорд: JavaScript: хорошие детали - страница 16

Согласно Аннотированному ECMAScript 5.1 раздел 11.11:

В случае оператора логического ИЛИ (||),

expr1 || expr2 Возвращает expr1, если его можно преобразовать в true; в противном случае возвращает expr2. Таким образом, при использовании с логическими значениями, || возвращает true, если любой из операндов равен true; если оба являются ложными, возвращает ложь.

В приведенном примере

var oneOrTheOther = someOtherVar || "это не те дроиды, которых вы ищете... двигайтесь вперед";

Результатом будет значение someOtherVar, если Boolean(someOtherVar) имеет значение true(см. " Правдивость выражения"). Если оно ложно, результатом будет "это не те дроиды, которых вы ищете... двигайтесь вперед";

И в случае логического оператора И (&&),

Возвращает expr1, если его можно преобразовать в false; в противном случае возвращает expr2. Таким образом, при использовании с логическими значениями && возвращает true, если оба операнда имеют значение true; в противном случае возвращает false.

В приведенном примере

случай 1: когда Boolean(someOtherVar) имеет значение false: возвращает значение someOtherVar.

случай 2: когда Boolean(someOtherVar) имеет значение true: он возвращает "это не те дроиды, которых вы ищете... двигайтесь вперед".

Я вижу это иначе, чем большинство ответов, поэтому надеюсь, что это кому-то поможет.

Чтобы вычислить выражение, включающее ||, вы можете прекратить вычисление выражения, как только найдете истинный термин. В этом случае у вас есть две части знаний, а не одна:

  1. Учитывая, что термин является истинным, все выражение оценивается как истинное.
  2. Зная 1, вы можете прекратить оценку и вернуть последний оцененный член.

Например, false || 5 || "hello" оценивается до 5 включительно, что является правдой, поэтому это выражение оценивается как true и возвращает 5.

Таким образом, значение выражения - это то, что используется для оператора if, но последний оцененный термин - это то, что возвращается при назначении переменной.

Точно так же оценка выражения с помощью && включает завершение на первом термине, который является ложным. Затем он возвращает значение false и возвращает последний оцененный член.

Если вы теперь прочтете все примеры в приведенных выше ответах, все будет иметь смысл :)

(Это всего лишь мое мнение по этому поводу и мое предположение о том, как это работает на самом деле. Но это не подтверждено.)

Я видел, что && используется здесь на работе для операторов присваивания. Проблема состоит из двух частей: 1) Проверка "индикатора" иногда является функцией с накладными расходами, которую разработчики не учитывают. 2) Разработчикам легко увидеть это как проверку безопасности и не учитывать, что они присваивают false своим var. Мне нравится, чтобы у них было безопасное отношение, поэтому я могу изменить это:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex();

к этому:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex() || 0;

поэтому они получают целое число, как и ожидалось.

Другие вопросы по тегам