||преобразование пустой строки в bool, && не - PullRequest
2 голосов
/ 05 декабря 2011

Это нормально?Это особенность или ошибка?(Я использую firebug):

>>> '' || true
true
>>> '' || false
false
>>> '' && false
""
>>> '' && true
""

Ответы [ 3 ]

8 голосов
/ 05 декабря 2011

Это , а не , преобразующее пустую строку в Boolean.

С ||

Он оценивает левую часть, пустой строкой которой является falsy . Затем он проверяет правую часть (потому что это или , а эта сторона может быть истинной) и возвращает это значение.

С &&

Поскольку && необходимо, чтобы обе стороны были true , а левая сторона falsy , проверка правой стороны не беспокоит ( оценка короткого замыкания *) ). Поэтому он просто возвращает левую часть, которая является пустой строкой.

JavaScript всегда возвращает последнее значение, которое он оценил.

>>> '' || 0 || undefined || null || false || NaN || 'hello'
"hello"
4 голосов
/ 05 декабря 2011

Дело не в том, что один конвертирует, а другой нет;строки с || возвращают свой второй операнд, а строки с && возвращают свой первый из-за короткого замыкания.

[ECMA-262 11.11]: Семантика

Производство LogicalANDExpression : LogicalANDExpression && BitwiseORExpression оценивается следующим образом:

  1. Пусть lref будет результатом оценки LogicalANDExpression.
  2. Пусть lval будет GetValue(lref).
  3. Если ToBoolean(lval) равно false, return lval.
  4. Пусть rref будет результатом вычисления BitwiseORExpression.
  5. Возврат GetValue(rref).

Производство LogicalORExpression : LogicalORExpression || LogicalANDExpression оценивается следующим образом:

  1. Пусть lref будет результатом оценки LogicalORExpression.
  2. Пусть lval будет GetValue(lref).
  3. Если ToBoolean(lval) равно true, верните lval.
  4. Пусть rref будет результатом вычисления LogicalANDExpression.
  5. Возврат GetValue(rref).

Произведения LogicalANDExpressionNoIn и LogicalORExpressionNoIn оцениваются так же, как LogicalANDExpression и LogicalORExpression произведений, за исключением того, что вместо LogicalANDExpressionNoIn, BitwiseORExpressionNoIn и LogicalORExpressionNoIn оцениваются вместосодержащиеся LogicalANDExpression, BitwiseORExpression и LogicalORExpression соответственно.

ПРИМЕЧАНИЕ Значение, полученное с помощью оператора && или ||, необязательно имеет тип Boolean.Полученное значение всегда будет значением одного из двух выражений операнда.

4 голосов
/ 05 декабря 2011

Оператор || вернет первое истинное значение.

Оператор && вернет второе значение, если первое верно, иначе вернет первое.

Для получения дополнительной информации вы можете увидеть страницу Логические операторы на сайте MDC .

В вашем случае

  1. '' || true; '' имеет значение false, поэтому оператор || перемещается на второе значение, которое имеет значение true, и возвращает его.
  2. '' || false; '' имеет значение false, поэтому оператор || перемещается на второе значение, которое является ложным и не имеет больше значений для сравнения, поэтому возвращает его.
  3. '' && false; первое значение ('') является ложным, поэтому оно возвращает его.
  4. '' && true; первое значение ('') является ложным, поэтому оно возвращает его.
...