Во время процесса подачи заявки на JavaScript мы столкнемся с различными сравнениями. Сегодня я собрал для вас три ситуации и изучаю их вместе.
1. Сравнение двух объектов
Сравнения JavaScript смешаны с некоторыми странными функциями, давайте посмотрим на некоторые простые сравнения.
// Сравнение необработанных значений> var a = 12undefined> var b = 12undefined> a == btrue> a === btrue // Сравнение объектов> var c = [] undefined> var d = [] undefined> c == dfalse> c === dfalse
Из приведенных выше результатов мы видим, что сравнение двух исходных значений, кажется, немного отличается от сравнения объектов. Если вы сравниваете значения двух объектов, даже если их значения одинаковы, конечный результат отличается. При сравнении двух объектов следует сравнивать ссылки двух объектов.
Если мы сделаем это:
> var m = {} undefined> n = m {}> n === mtrueЭто означает, что обе переменные указывают на один и тот же объект, поэтому они одинаковы.
2. Сравнение различных типов
Есть также следующая особая ситуация
> 12 == "12" true> null == undefinedtrue> undefined == falsefalse> null == falsefalse> null === не определено
Почему целые числа могут быть равны струнам? Это потому, что == (равное, не конгруэнтное) не сравнивает типы. Прежде чем сравнивать, он будет печатать значения, которые необходимо сравнить. Здесь строка будет преобразована в числовые типы, а затем сравнивается . Почему это так уверенно? Давайте проведем некоторые эксперименты.
> 1 + 23> 1 + "2" '12'> 2 <"12" true> "2" <"12" FALSE
Из приведенного выше примера мы видим, что значение 2 действительно меньше строки 12. Если сравнение было преобразовано в строку до того, как значение было преобразовано в строку, результат должен быть «2»> «12».
Еще не верите? Позвольте мне привести еще один пример.
> "12d"> 12false> "12d" <12false> "12d" == 12false> "12" <"12d"
Почему это? Если вы конвертируете 12 в строку, то 12D должен быть больше 12, верно? Почему вы сравниваете это с ложным? Я думаю, это из -за особого парня ниже.
> Nan <1false> nan> 1false
Независимо от того, с чем NAN сравнится, он вернет ложь. Включая себя. Следовательно, лучший способ определить, является ли переменная NAN NAN x! Тогда здесь это должно быть, когда 12D должен быть преобразован в числовой тип, потому что он имеет особые символы и, наконец, становится NAN. Независимо от того, как вы сравниваете его с числовым типом, результат является ложным.
Для цифровых и струнных операторов оператор знака плюс ведет себя иначе, чем оператор сравнения. Оператор Plus предпочитает струны, и если один из операндов является строкой, он будет преобразован в строку. Операторы сравнения предпочитают числа, а сравнения строк будут выполняться только тогда, когда оба числа будут строками.
Что касается нулевого и неопределенного выше. Полем Полем Полем Полем Я не знаю, как объяснить их поведение на данный момент. Я могу только помнить это сейчас. Потому что они особенные.
3. Сравнение объектов с исходными значениями
Если два объекта, которые необходимо сравнить, являются объектами JavaScript и скелетами, будет выполнена определенная степень преобразования типа. Найдите способ преобразовать значение объекта в исходное значение. Вообще говоря, есть два метода valueOf, toString . Ниже приведен процесс преобразования пустого объекта:
// Я написал это напрямую> a = {} {} // 1. (И наоборот)> a.toString () '[объект объекта]'> a == '[объект объекта]' true Выше приведено на самом деле встроенный процесс преобразования объектов и механизм JavaScript. Сначала он вызовет valueOf для преобразования. Если полученное значение не является примитивным значением, оно будет затем вызвать toString для преобразования. Окончательным значением является '[object Object]' очень странное значение, но это исходное значение. Если переменная a и это значение равно (не конгруэнтно), может быть получен истинный результат. (Это рухнуло?)
Тем не менее, авторитетное руководство дает следующие принципы, мы можем ссылаться на него.
Преобразовать необработанные значения JavaScript Language Core встроенные классы сначала попробуйте преобразовать с ValueO F, а затем использовать toString для преобразования. За исключением класса даты, он использует только toString для преобразования. Объекты, которые не находятся в ядре JavaScript, преобразуются в исходные значения через то, как они определены в их соответствующих реализациях.
В соответствии с вышеупомянутым объяснением. Когда мы сравниваем a = {} с исходным значением, сначала вызовут функцию valueOf , и результатом является то, что {}, очевидно, не является примитивным значением. Затем преобразование будет выполнено с использованием toString . Наконец, этот странный результат вышел. Но этот странный результат '[object Object]' действительно является исходным значением {}. (Это буквальный из строки).
Выше приведено сравнительное резюме в JavaScript. Я надеюсь, что описание в этой статье будет полезно для всех при изучении JavaScript.