Оператор Javascript AND в задании

Я знаю, что в 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 false?

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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


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

Ответ 3

&& иногда называют защитным оператором.

variable = indicator && value

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

Ответ 4

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

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

Uncaught TypeError: Cannot read property 'name' of undefined 

Если вы не хотите, чтобы это произошло, вы можете сделать это, используя && оператор в задании:

// username is not assigned here
var user = 'mrsmith';
var username = user && user.username;
console.log('username', username);

Результат undefined. Если пользователь && user.name - false, он не будет пытаться получить доступ к "user.name" и оставляет переменную "username" undefined.

// username is assigned here
var user = 'mrsmith';
var username = user && user.username || user;
console.log('username', username);

Результаты в "mrsmith" как пользователь && & user.name привел к ложному, а затем отправился к пользователю и привел к "mrsmith"

См. этот простой пример для справки: https://jsfiddle.net/qv6rg940/3/

Другим полезным странным назначением, которое в практическом использовании, является оператор OR, который более распространен, чтобы только что-то определить, если его НЕ определено, которое вы, вероятно, видели в плагинах или фреймах, например:

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

который будет определять только виджет, если "myWidget" undefined.

Вы можете даже сходить с ума и поместить его в настоящую логику алгоритма следующим образом:

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

Метод защиты Lodash

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

var val = _.get(obj, 'some.very.nested.stuff.might.not.be.defined');

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

Ответ 5

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

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

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

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

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

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

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

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

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

case 1: когда Boolean (someOtherVar) false: он возвращает значение someOtherVar.

case 2: когда Boolean (someOtherVar) истинно: он возвращает "это не дроиды, которые вы ищете... двигаться вперед" .

Ответ 6

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

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

:

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

чтобы получить целое число, как ожидалось.