Оператор 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;
чтобы получить целое число, как ожидалось.