Вопрос

Я знаю, что в 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, и мне интересно, что произойдет с назначением в сочетании с оператором и оператором.

Это было полезно?

Решение

В основном логично и оператор (&&) вернет стоимость второго операнда, если первый правдивость, и это вернет ценность первого операнда, если он сам по себе фальсификатор, Например:

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

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

Другие советы

&& иногда называют сторожить оператор.

variable = indicator && value

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

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

То && Оператор производит ценность своего первого операнда, если первый операнд является фальсию. В противном случае это производит ценность второго операнда.


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

Пример начинающих

Если вы пытаетесь получить доступ к «User.Name», но это произойдет:

Uncaught TypeError: Cannot read property 'name' of undefined 

Не бойся. Вы можете решить это, используя && оператор в задании или часто называют Оператор охраны С момента этого «охранники» от неопределенной ошибки происходит.

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

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, '' а также правдивость просто означает не фальсию.

Простая кнопка для охранника

Используйте красивый оператор охраны Лодаша, чтобы получить доступ к вложенным данным:

// 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» является фальсию. Это удобно, потому что вы можете объявить код в любом месте и несколько раз, не заботясь, если его назначен или не ранее, зная, что он будет назначен только один раз, поскольку люди, использующие плагин, могут случайно объявлять свой тег сценария SRC несколько раз.

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

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

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

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

Глубина объяснения здесь: Palindreome Check в JavaScript

Счастливое кодирование.

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

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

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

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

var deortheherot = quotothervar || «Это не дроиды, которые вы ищете ... двигаться вдоль»;

Результат будет ценностью кариетара, если логический (outwordervar) верно.(Пожалуйста, обратитесь. Правдивость выражения). Если это false, результат будет «это не дроиды, которые вы ищете ... двигаться вдоль»;

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

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

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

Случай 1: когда логический (outwordervar) ложный: он возвращает значение quotothervar.

Случай 2: Когда Boolean (quotothervar) верно: он возвращает "Это не дроиды, которые вы ищете ... двигаться вдоль".

Я видел && уже использовал здесь на работе на присвоение заявления. Концерн в два раза: 1) Проверка «Индикатор» иногда является функцией с накладными расходами, что разработчики не учитываются. 2) Это легко увидеть его как проверку безопасности, и не считает, что они назначают ложь к их VAR. Я люблю их иметь безопасное отношение типа, поэтому у меня их изменить это:

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

к этому:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top