Подтвердить что ты не робот

Значения фальсификации Javascript (null, undefined, false, empty string: "" или '' и 0) и оператор сравнения (==)

Когда я использую какое-либо из значений (null, undefined, false, '', 0) в выражении if, он всегда оценивается как ошибка (false), Кроме того, отрицание этих значений ((null, undefined, false, '', 0) в операторе if всегда оценивается как тавтология (true).

 if(null){
 }else{
 }

 if(undefined){
 }else{
 }

 if(false){
 }else{
 }

 if(''){
 }else{
 }

 if(0){
 }else{
 }

Во всех вышеприведенных случаях оператор if вычисляется как выполняется оператор false и else. Однако, когда я сравниваю эти ошибочные значения с оператором ==, он не возвращает true всегда. Удивительно, но он всегда возвращает значения true, когда я сравниваю отрицание этих значений.

если оператор double equalto (==) проверяет/сравнивает значения, а не строго для типов, то почему:

null == false          // returns false

null == 0              // returns false

null == ''             // returns false

Но,

!null == !false       // returns true

!null == !0           // returns true

!false == !undefined  // returns true

и

null == undefined     // returns true

false == 0            // returns true

Я ценю, если кто-нибудь может прояснить поведение или взаимосвязь между этими значениями (null, undefined, false, '', 0).

4b9b3361

Ответ 1

Распространенное заблуждение

"... Если оператор double equalto (==) проверяет/сравнивает только значения, а не типы..."

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

См. Алгоритм сопоставления абстрактного равенства.

Сравнение

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

Тип принуждения, который он выполняет, очень специфичен для типов операндов. Для разных пар типов может иметь место другая последовательность принуждений. Обычно (но не всегда) он в конечном итоге приводит к принудительному выполнению операндов до типов number.


Почему ! использование операндов меняет вещи

Когда вы вручную принудительно применяете оба операнда с помощью !, теперь вы выполняете простое преобразование в булево, что приводит к совпадению типов, что позволяет избежать коэрцитивной части алгоритма, что ведет к поведению как Строгий алгоритм сравнения равенства.

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


Не забывайте о NaN

И FYI, есть еще одно "ложное" значение для рассмотрения, NaN. Его сравнение == всегда будет false, несмотря ни на что. Даже при сравнении с другим значением NaN это будет false.

Ответ 2

undefined: означает, что переменная была объявлена, но не имеет назначенного значения

null: присвоено значение null, что означает, что он не имеет значения

false, '' и 0 Я думаю, вы, вероятно, можете решить, что это значит.

Ответ 3

NULL отличается от false (NULL имеет тип объекта, а false - типа логического), null отличен от 0 (0 имеет тип integer), null также отличается от '' ('' имеет тип строка). но все они являются ложными значениями.! оператор сбрасывает логическое значение. Если! используется для значений фальши, это приводит к преобразованию значений фальши в объект типа boolean.