Почему использование "0" с тернарным оператором возвращает первое значение?

я играл с JSconsole и нашел что-то странное. Значение "0" ложь

"0" == false
=> true

значение false при использовании в тернарном возвращает второе значение

false ? 71 : 16
=> 16
значение "0" что составляет false при использовании в ternary возвращает первое значение.
"0" ? 8 : 10
=> 8

однако, если вы используете 0 в качестве значения, он возвращает второе значение

0 ? 4 : 5
=> 5

0 == "0"
=> true

боюсь, для меня это не имеет смысла.

4 ответов


"0" - это строка длиной>0 что это true. Попробуй!--21-->

0 ? 8 : 10

и видим. Он вернется 10.

== тут преобразования типа и, следовательно, когда вы делаете

"0" == false

возвращает true. Когда вы делаете

0 == "0" //true

он также возвращает true, поскольку снова происходит преобразование типа. Даже если один из них number и другие string он возвращает true. Но если вы используете ===, нет преобразование типов выполнено и 0 === "0" вернутся false.

хорошее объяснение == & === дано здесь.

С docs:

оператор равенства(==) преобразует операнды, если они не одного типа, а затем применяет строгое сравнение.

личность оператор(===) возвращает правда если операнды строго равны без преобразования типов.


непустая строка рассматривается как значение истинности в условных операторах, условных выражениях и условных конструкциях.

но когда вы сравниваете строку с номером с ==, произойдет некоторое преобразование.

при сравнении числа и строки, строка преобразуется в числовое значение. JavaScript пытается преобразовать строку numeric литерал к значению типа числа. Во-первых, математический значение выводится из строкового числового литерала. Затем это значение округляется до ближайшее значение типа номера.

и == нет транзитивное свойство равенства:

ты не можешь сказать if a == b, b == c, then a == c.

пример будет:

"0" == false // true
false == "\n" //true

и угадать результат "0" == "\n"? Да, результат false.


боюсь, это пример того, почему вы должны использовать === - обычный старый == выполняет преобразование типа. Попробуй!--4-->

"0"===false

JavaScript приводит к тоннам WTFs.

Проверьте "Javascript WTF" на YouTube...

по существу, вы запрашиваете преобразование из строки В тип boolean.

это определяется как "строка не пуста".

тогда как вы предположили, что javascript делает string - > int - > boolean, если строка содержит число.

Это разумный. Но эти автоматические преобразования приводят к ошибкам программирования , именно поэтому я предпочитаю языки typesafe (с проверкой типа времени компиляции) для более крупных проектов.

для удовольствия попробуйте следующее:

("0" * 1) ? 71 : 16
("0" + false) ? 71 : 16