Почему ('0'? 'A': 'b') ведет себя иначе, чем ('0' == true? 'A': 'b')

Почему результат следующих двух операторов отличается?

('0' ? 'a' : 'b') /* -> 'a' */
('0' == true ? 'a' : 'b') /* -> 'b' */

jsFiddle testcase

Edit:

Я должен добавить, что я подозреваю, что первый оператор "0", который нужно отличить до логического значения для сравнения, - который должен быть точно таким же, как "'0' == true" Очевидно, это не так.

Ответ 1

Во-первых, для полноты:

('0' ? 'a' : 'b') 

есть 'a', потому что '0' - a непустая строка, которая всегда оценивается как true:

String: результат false, если аргумент является пустой строкой (ее длина равна нулю); в противном случае результат true.


Теперь до '0' == true.

Здесь произойдут преобразования двух типов. Мы можем следовать этому в спецификации, раздел 11.9.3, Алгоритм сравнения абстрактного равенства.

Операнды обозначаются как x и y (x == y).

В нашем случае x является строкой ('0'), а y является булевой (true). Следовательно, выполняется этап 7:

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

Когда логические значения преобразуются в числа, происходит следующее преобразование:

Boolean: результат 1, если аргумент true. Результат +0, если аргумент false.

Теперь мы имеем

'0' == 1

который соответствует условию на шаге 5:

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

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

Итак, окончательное сравнение

0 == 1

который равен false (шаг 1. a. vi.)

Ответ 2

('0' ? 'a' : 'b'); /* -> 'a' */

0 - строковое значение , каждая непустая строка оценивается как true и не проверяется как логическая. Если цитаты удалены:

(0 ? 'a' : 'b'); /* -> 'b' */

вы получите b - now 0 не является строкой и оценивается как false!

('0' == true ? 'a' : 'b'); /* -> 'b' */

0 оценивается как bool Оба оцениваются как числа, что является ложным. Point 11.9.3 Алгоритм сравнения абстрактного равенства из specs показывают, что для сравнения одного и того же типа переменных может быть выполнено несколько преобразований.

Ответ 3

Потому что '0' не равно 1, поэтому он не равен true, хотя он не является ложным. В первом случае, когда "0" передается в bool, оператор casting возвращает true для всего, что не равно 0.

Ответ 4

В основном потому, что JavaScript довольно чертовски непоследовательный, когда дело доходит до истины. Но ответ:

  • В этом случае '0' преобразуется непосредственно в Boolean, а '0', будучи непустой строкой, является истинным.
  • В этом случае преобразование не выполняется; строка не равна логическому значению.

Ответ 5

Это потому, что '0' является истинным (в выражении if), но не считается равным true. Точно так же, как и 3, и 17 являются истинными, но не равными.

Ответ 6

('0'? 'a': 'b') → 0 - false, '0' - некоторая строка, поэтому NOT FALSE 0, null или '' (пустая строка) в этом случае рассматривается как FALSE

('0' == true? 'a': 'b') → как упоминалось другими some_string по сравнению с логическим значением TRUE не является TRUE