Почему использование "0" с тройным оператором возвращает первое значение?
Я играл с JSconsole и нашел что-то странное. Значение "0"
- false
"0" == false
=> true
Значение false
при использовании в тернаре возвращает второе значение
false ? 71 : 16
=> 16
Однако значение "0"
, которое равно false
, когда используется в тройном, возвращает первое значение.
"0" ? 8 : 10
=> 8
Однако, если вы используете 0
как значение, оно возвращает второе значение
0 ? 4 : 5
=> 5
0 == "0"
=> true
Я боюсь, что это не имеет смысла для меня.
Ответы
Ответ 1
"0"
- строка длиной >0
, которая true
. Попробуйте
0 ? 8 : 10
и посмотрим. Он вернет 10
.
==
выполняет преобразование типов и, следовательно, когда вы делаете
"0" == false
он возвращает true
. Когда вы делаете
0 == "0" //true
Он также возвращает true, поскольку снова происходит преобразование типа. Даже если один из number
, а другой - string
, он возвращает true. Но если вы используете ===
, преобразование типа нет завершено, а 0 === "0"
вернет false
.
Хорошее объяснение ==
и ===
дано здесь.
Из docs:
Оператор равенства (==
) преобразует операнды, если они не одного типа, затем применяет строгое сравнение.
Идентичный оператор (===
) возвращает true, если операнды строго равны без преобразования типа.
Ответ 2
Непустая строка считается значением истины в условных операторах, условных выражениях и условных конструкциях.
Но когда вы сравниваете строку с номером с ==
, произойдет некоторая конверсия.
При сравнении числа и строки строка преобразуется в числовое значение. JavaScript пытается преобразовать строку числовой literal к значению типа Number. Во-первых, получается математическое значение из строкового числового литерала. Затем это значение округляется до ближайшее значение типа номера.
И ==
не имеют Transitive Property Equality:
вы не можете сказать if a == b, b == c, then a == c
.
Пример:
"0" == false // true
false == "\n" //true
и угадать результат "0" == "\n"
? Да, результат false
.
Ответ 3
Я боюсь, что это пример того, почему вы должны использовать ===
- простой старый ==
выполняет преобразование типов. Попробуйте
"0"===false
Ответ 4
JavaScript ведет к тоннам WTF.
Посмотрите "Javascript WTF" на YouTube...
По сути, вы запрашиваете преобразование из строки в boolean.
Это определяется как "строка не пустая".
Принимая во внимание, что javascript делает string → int → boolean, если строка содержит число.
Это разумно. Но эти автоматические преобразования приводят к ошибкам программирования, поэтому я предпочитаю типы языков (с проверкой типа времени компиляции) для более крупных проектов.
Для удовольствия попробуйте следующее:
("0" * 1) ? 71 : 16
("0" + false) ? 71 : 16