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