Следующее показывает, что "0"
это ложно в Javascript:
>>> "0" == false
true
>>> false == "0"
true
Так почему же печатается следующее "ha"
?
>>> if ("0") console.log("ha")
ha
javascript
boolean
nonopolarity
источник
источник
"0"
является строкой, и поскольку она не пустая, она оценивается как true."0" === false [...] false
'0'==false
но '0' не является ложным значением (да, Javascript может быть странным)==
, они никогда не преобразуются в логические значения, поэтому это не применяется. (Правила для конвертации, кажется, предпочитают конвертировать в числа.)Ответы:
Причина в том, что когда вы явно делаете это
"0" == false
, обе стороны преобразуются в числа, и затем выполняется сравнение.Когда вы делаете:,
if ("0") console.log("ha")
строковое значение проверяется. Любая непустая строка естьtrue
, а пустая строка естьfalse
.источник
Таблицы, отображающие проблему:
и ==
Мораль истории использования ===
кредит для генерации таблицы: https://github.com/dorey/JavaScript-Equality-Table
источник
NaN
хотя. Я имею в виду,typeof NaN // number
ноNaN === NaN // false
, хм ...NaN
, поэтому, когда вы сравниваете 2 NaN, они имеют разные значения (я думаю). Прочитайте первую цитату здесь .==
ни===
оператор для[]
,{}
,[[]]
,[0]
и[1]
значения не вычисляться так. Я имею в виду,[] == []
а[] === []
также ложь.Это в соответствии со спецификацией.
ToBoolean, согласно спецификации, это
И эта таблица говорит о строках:
Теперь, чтобы объяснить, почему
"0" == false
вы должны прочитать оператор равенства, который заявляет, что он получает свое значение от абстрактной операции,GetValue(lref)
совпадает с правой стороной.Который описывает эту соответствующую часть как:
Или, другими словами, строка имеет примитивную базу, которая вызывает внутренний метод get и в конечном итоге выглядит как false.
Если вы хотите оценить вещи, используя операцию GetValue, используйте
==
, если вы хотите оценить, используяToBoolean
, используйте===
(также известный как «строгий» оператор равенства)источник
"a string has a primitive base, which calls back the internal get method and ends up looking false"
Это правда для всех строк?Section 8.12.3: [[Get]] (P)
описывает, как это работает. Это верно только для случаев, когда строкаGetOwnProperty
равна 0, так как она выполняет кучу других внутренних вызовов, в результате которых обнаруживается, что «что угодно» является свойством данных, которое затем полностью возвращает это значение. Вот почему «0» - ложь, а «бла» - правда. Посмотрите видео Дугласа Крокфорда на театре разработчиков Yahoo, он описывает «правдивость» в JavaScript чуть менее сложно, чем я. Если вы понимаете, что означает «правдивость» и «ложь», вы сразу поймете ответ Бобинса.Это PHP, где строка
"0"
ложная (false-when-used-in-boolean-context). В JavaScript все непустые строки являются достоверными.Хитрость в том, что
==
логическое значение не оценивается в логическом контексте, оно конвертируется в число, а в случае строк это делается путем анализа в виде десятичного числа. Таким образом, вы получите номер0
вместо истинности логическогоtrue
.Это очень плохой языковой дизайн, и это одна из причин, по которой мы стараемся не использовать неудачный
==
оператор. Используйте===
вместо этого.источник
источник
Ваши кавычки вокруг
0
делают это строкой, которая оценивается как истина.Удалите цитаты, и это должно работать.
источник
Это все из-за спецификаций ECMA ...
"0" == false
из-за правил, указанных здесь http://ecma262-5.com/ELS5_HTML.htm#Section_11.9.3 ... Иif ('0')
оценивается как true из-за правил, указанных здесь http: / /ecma262-5.com/ELS5_HTML.htm#Section_12.5источник
Выражение «если» проверяет на правдивость, а двойное равенство - на независимость от типа. Строка всегда правдива, как отмечали другие. Если дважды равно испытывали оба операнда для truthiness и сравнение полученных результатов, то вы получите результат вы интуитивно предполагая, т.е.
("0" == true) === true
. Как говорит Дуг Крокфорд в своем превосходном JavaScript: «Хорошие части» , «правила, по которым [== приводит типы своих операндов], сложны и не запоминаются… Отсутствие транзитивности вызывает тревогу». Достаточно сказать, что один из операндов приведен к типу для соответствия другому, и что «0» в конечном итоге интерпретируется как числовой ноль,источник
== Оператор равенства оценивает аргументы после преобразования их в числа. Поэтому строка нулевой «0» преобразуется в тип данных Number и логическое значение FALSE преобразуется в число 0. Итак
То же относится и к `
=== Строгая проверка на равенство оценивает аргументы с исходным типом данных
То же относится и к
В
Строка «0» не сравнивается ни с одним аргументом, и строка является истинным значением до тех пор, пока не будет сопоставлена с какими-либо аргументами. Это в точности как
Но
`
источник
Это потому, что JavaScript использует приведение типов в булевых контекстах и ваш код
будет приведен к истине в логических контекстах.
Есть другие истинные значения в Javascript, которые будут приведены к true в логических контекстах, и, таким образом, выполнить блок if:
источник
принуждает x с помощью внутреннего JavaScript toBoolean (http://es5.github.com/#x9.2)
принуждает обе стороны, используя внутреннее приведение к toNumber (http://es5.github.com/#x9.3) или toPrimitive для объектов (http://es5.github.com/#x9.1)
Для получения полной информации см. Http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
источник