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

Я нашел несколько примеров в другой ветке, но не понял.

0 == '0'            // true

0 слева я преобразовал в ложь (единственное число, которое делает это). Справа - непустая строка, которая преобразуется в true. Так как же ложь == правда -> правда

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

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

2 ответа

Решение

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

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

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

х == у

Примеры

3 == 3 // верно

"3" == 3 // верно

3 == '3' // true

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

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

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

Оператор идентификации возвращает 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

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

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

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

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

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

JavaScirpt Table Equality: http://dorey.github.io/JavaScript-Equality-Table/

Другие вопросы по тегам