Falsy? Как оператор && заставляет 0 возвращать 0, а не NaN? - PullRequest
1 голос
/ 02 октября 2011

Я читал, что иногда оператор && используется для «короткого замыкания» JavaScript, заставляя поверить, что возвращаемое значение 0 равно 0, а не NaN, потому что 0 является ошибочным числом в JavaScript. Я искал вокруг, чтобы выяснить, что все это значит. Может кто-нибудь объяснить это непрофессионалу?

Например:

function sign(number) {    
    return number && number / Math.abs(number); }

Вернет 0, если number равно 0.

Ответы [ 3 ]

6 голосов
/ 02 октября 2011

Это звучит как ответ, который я видел раньше, но не могу найти сейчас (ссылка будет полезна), но у вас здесь неправильный конец флешки.

Учитывая ситуацию как:

foo = 0 ;
bar = foo && 2 / foo;

Во второй строке вычисляется foo. Это 0 и, следовательно, ложное значение. Левая часть && (foo) будет возвращена и присвоена bar.

Теперь, если у нас есть foo = 1:

foo = 1 ;
bar = foo && 2 / foo;

Опять же, foo будет оцениваться. Это истинное значение, поэтому правая часть && будет оценена и возвращена. 2 / foo равно 2, поэтому 2 назначено на bar.

«Короткое замыкание» просто означает, что как только часть && выходит из строя, он возвращает неисправную часть, не оценивая ничего вправо.

4 голосов
/ 02 октября 2011

В JavaScript логические операторы && и || не обязательно возвращают логическое значение.Вместо этого они смотрят на «правдивость» своих аргументов и могут соответственно замкнуть цепь.Некоторые значения, такие как 0, пустая строка "" и null являются "ложными".

Короткое замыкание означает лишь пропуск оценки правой части выражения, поскольку левой части достаточнопредоставить ответ.

Например: выражение типа var result = 100 / number; даст вам NaN при number = 0, но:

var result = number && 100 / number;

даст вам 0 вместо NaN, поскольку0 это ложь.В логическом контексте false && anything равен false, поэтому нет смысла оценивать правую часть.Аналогично:

// supposed msg is a potentially empty string
var message = msg || "No message";

даст вам msg, если строка msg не пуста (правда), поскольку true || anything равно true.Если msg пусто , вы получите "No message instead".

1 голос
/ 02 октября 2011

Мне кажется, я понимаю, что вы имеете в виду, однако это не так.

var some_bool = (func_a() && func_b());

Теперь, когда func_a возвращает false, func_b действительно не вызывается.Однако, когда он возвращает NaN (который, как и 0, равен false), он все равно возвращает false!

...