Javascript: странное поведение сравнения - PullRequest
5 голосов
/ 19 января 2012

Если я выполню следующий фрагмент в консоли FireBug, он каким-то образом напечатает surprise!:

['surprise!', 'boring'][Number(0=="​")]

Но почему?

UPD

Извините, люди, это была шутка! Джере первым заметил! Вчера я нашел в строке ZERO WIDTH SPACE и с тех пор испытывал соблазн повеселиться =)

Ответы [ 5 ]

9 голосов
/ 19 января 2012

Существует дополнительный невидимый символ между вашими цитатами .

Если вы напечатаете это, вы получите 'скучно', потому что 0 == "" оценивается как true, Number (true) равно 1.

Вставьте эти два и посмотрите различный результат:

0=="​"

выходы false

0==""

выходы true

Единственное, что я изменил, - это удаление символа между "".

8 голосов
/ 19 января 2012

0=="​" равно false ( Поскольку у вас есть непечатаемый символ в строке ), Number(false) равно 0 (согласно стр. 34 спецификации * 1008)*), а «сюрприз» - это 0-й индекс массива.

4 голосов
/ 19 января 2012

ES5 11.9.3 Оператор ==

Если тип (x) равен Number, а тип (y) равен String, вернуть результат сравнения x == ToNumber (y).

и

МЗ StringNumericLiteral ::: [пусто] равно 0.

Итак, 0=="" возвращает 0 == ToNumber(""), что является 0 == 0, что является истинным.

По == правилам конвертации 0=="" равно true

ES5 15.7.1.1 Число (значение) вызывает ES5 9,3 toNumber toNumber(true) === 1

И ["suprize!", "boring"][1] возвращает "boring", что явно неверно.

Почему это правильно? Потому что

"​".charCodeAt(0) === 8203

Ваш строковый литерал не является пустой строкой. В вашей строке пробел нулевой ширины .

Теперь, если мы вернемся к ES5 11.9.3 ==, оператор мы увидим

Если грамматика не может интерпретировать строку как расширение StringNumericLiteral

Что означает

  • 0==""
  • 0==NaN
  • false
  • toNumber(false) === 0
  • Number(0=="") === 0
  • ["suprize!", "boring"][0] === "suprize!"
1 голос
/ 19 января 2012

['surprise!', 'boring'][Number(0=="​")] вернет «скучно», потому что ваш код:

Number(0=="​") //returns true

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

Если вы напишите код правильно, то вернете true, и результат будет boring, как и ожидалось.

Но если скопировать и вставить ваш код, вернете false, поэтому у вас есть символ между ""(вы можете проверить, используя клавиатуру или "". длина)

, чтобы ваш код возвращал значение false, равное 0, а затем - «удивление!»

Вы обманываете человека: P

['surprise!', 'boring'][Number(0=="​")]

"​".length //returns 1 ;)

"​" != "" // OH GOD THIS IS TRUE :P
0 голосов
/ 12 августа 2014

Мне становится скучно, когда я запускаю это в console console.log (['surpeise!', 'Скучно'] [Number (0 == "")])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...