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