Javascript 0 == '0'. Объясните этот пример

Я нашел примеры thoose в другом потоке, но я не понимаю.

0 == '0'            // true

0 слева я преобразован в false (это единственный номер, который делает это). Право - это непустая строка, которая преобразуется в true. Итак, как можно false == true → true

Что я пропустил?

Изменить: много жалоб. Я не понял своего конкретного случая. (И ссылка сверху - это именно то, где я копирую и вставляю этот случай)

4b9b3361

Вот официальный ответ на ваш вопрос (цитируемые части, ссылка внизу) и анализ:

Равенство (==)

Оператор равенства преобразует операнды, если они не одного типа, а затем применяет строгое сравнение. Если любой операнд является числом или логическим, операнды, если это возможно, преобразуются в числа; else, если любой операнд является строкой, операнд строки преобразуется в число, если это возможно. Если оба операнда являются объектами, тогда JavaScript сравнивает внутренние ссылки, равные, когда операнды относятся к одному и тому же объекту в памяти. Синтаксис

x == y

Примеры

3 == 3//true

"3" == 3//true

3 == '3'//true

Это означает, что, когда я прочитал это, первые 3 (целое число) преобразуется в строку для сравнения, поэтому он становится '3' == '3', что является истинным, таким же, как в вашем случае с нулями.

ПРИМЕЧАНИЕ. Я предполагаю, что конверсия может варьироваться в разных JS-машинах, хотя они должны быть унифицированы по спецификации ECMAScript - http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 (quoted @Derek 朕 會 功夫). Это предположение сделано на субъективном и императивном мнении о том, что не все браузеры и механизмы JavaScript там совместимы с ECMAScript.

Идентичность/строгое равенство (===)

Оператор identity возвращает true, если операнды строго равны (см. выше) без преобразования типа.

Идентичность/строгое равенство (===), найденное на том же ресурсе в конце ответа, пропустит автоматическое преобразование типа (как указано выше) и проведет проверку типов, чтобы убедиться, что мы имеем точное совпадение, т.е. вышеприведенное выражение не сработает:

typeof(int) == typeof(string)

Это обычный оператор в большинстве языков со слабым типом:

http://en.wikipedia.org/wiki/Strong_and_weak_typing

Я бы сказал, что нужно быть уверенным, что функция/метод вернется, если такая функция/метод вот-вот вернет числа (целые числа/числа с плавающей точкой), она должна придерживаться этого до самого конца, иначе противоположные практики могут вырезать голову по многим причинам, и один тоже лежит в этом вопросе.

Вышеприведенное действие относится к другим языкам со слабым набором текста, например PHP.

Подробнее об этом см. второй глава (Операторы равенства):

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators

6
ответ дан 07 авг. '14 в 22:26
источник

Когда вы используете ==, JavaScript будет очень стараться преобразовать две вещи, которые вы пытаетесь сравнить с тем же типом. В этом случае 0 преобразуется в '0' для сравнения, а затем приводит к true.

Вы можете использовать ===, который не будет делать никакого принуждения типа и является наилучшей практикой, чтобы получить желаемый результат.

Оператор равенства

Оператор равенства преобразует операнды, если они не одного типа, а затем применяет строгое сравнение. Если любой операнд является числом или логическим, операнды, если это возможно, преобразуются в числа; else, если любой операнд является строкой, операнд строки преобразуется в число, если это возможно. Если оба операнда являются объектами, тогда JavaScript сравнивает внутренние ссылки, которые равны, когда операнды ссылаются на один и тот же объект в памяти.

Источник: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators

Таблица JavaScirpt: http://dorey.github.io/JavaScript-Equality-Table/

1
ответ дан 07 авг. '14 в 22:22
источник