Почему ('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