Почему `'\ t \ n' == false` в JavaScript? - PullRequest
5 голосов
/ 12 апреля 2011

В JavaScript ...

'\t\n ' == false // true

Я могу предположить, что любая строка, состоящая исключительно из пробельных символов, в JavaScript считается равной false.

СогласноВ этой статье я полагал, что false будет преобразован в 0, но не смог найти упоминание о пробелах, считающихся равными false, с помощью Google.

Почему это так?Есть ли что-то хорошее по этой теме, кроме того, что мы углубились в спецификацию ECMAScript?

Ответы [ 4 ]

3 голосов
/ 12 апреля 2011

Эта страница содержит краткое изложение правил.

В соответствии с этими правилами '\t\n ' преобразуется в число (Number('\t\n') ==> 0), а falseпреобразуется в число (Number(false) ==> 0), и, следовательно, оба равны.


Ответ Алекса также является хорошим разбивкой по конкретному случаю '\t\n ' == false.


Важным отличием является то, что '\t\n ' является , а не ложью.Например:

if ('\t\n ') alert('not falsy'); // will produce the alert
2 голосов
/ 12 апреля 2011
whitespace == false; // true

Напечатайте принуждение, любите это или ненавидите это.

Копание в спецификации ES5.На самом деле не существует другого хорошего способа, кроме как читать то, что кто-то еще выкопал из спецификации ES5.

Если Type (x) - Boolean, вернуть результат сравнения ToNumber (x) == y.

new Number(false) == " "; // true

Булевы преобразованы в 0 или 1. Причина в том, что whitespace == 0

И если вы действительнохотите узнать о new Number(" "), затем прочитайте этот 9.3.1 в спецификации ES5.

Важная строка:

МЗ StringNumericLiteral ::: StrWhiteSpace равно 0.

1 голос
/ 12 апреля 2011

Я думаю, что процесс может быть описан в рекурсивной функции. (Представьте, что мы живем в мире, где JavaScript имеет только оператор строгого равенства.)

function equals(x, y) {
    if (typeof y === "boolean") {
        return equals(x, +y);
    }
    else if (typeof x === "string") {
        return +x === y;
    }
}

StringNumericLiteral, который пуст или содержит только пробел, преобразуется в +0.

1 голос
/ 12 апреля 2011

Вот как я думаю, что это работает, основываясь на моих показаниях и ответе Рейноса (а также других опоздавших на вечеринку).

// Original expression
lg('\t\n ' == false);
// Boolean false is converted to Number
lg('\t\n ' == new Number(false));
// Boolean has been converted to 0
lg('\t\n ' == 0);
// Because right hand operand is 0, convert left hand to Number
lg(new Number('\t\n ') == 0);
// Number of whitespace is 0, and 0 == 0
lg(0 == 0);

jsFiddle .

Пожалуйста, дайте мне знать, если я что-то не так.

...