Почему использование "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