Разница между нулем и undefined в JavaScript?
В соответствии с В чем разница между нулем и undefined в JavaScript?, null
и undefined
- это два разных объекта (имеющих разные типы) в Javascript. Но когда я пробую этот код
var a=null;
var b;
alert(a==null); // expecting true
alert(a==undefined); // expecting false
alert(b==null); // expecting false
alert(b==undefined); // expecting true
Вывод вышеуказанного кода:
true
true
true
true
Теперь, когда ==
соответствует только значению, я думал, что оба undefined
и null
должны иметь одинаковое значение. Поэтому я попробовал:
alert(null)
→ дает null
alert(undefined)
→ дает undefined
Я не понимаю, как это возможно.
Вот демо.
Изменить
Я понимаю, что ===
даст ожидаемый результат, потому что undefined
и null
имеют разные типы, но как преобразование типа работает в Javascript в случае ==
? Можем ли мы сделать явное преобразование типов, как в Java? Я хотел бы применить ручное преобразование типов на undefined
и null
.
Ответы
Ответ 1
Вам нужно использовать оператор идентификатор ===
, а не оператор равенства ==
. С этим изменением ваш код работает как ожидалось:
alert(a===null); // true
alert(a===undefined); // false
alert(b===null); // false
alert(b===undefined); // true
Причина, по которой оператор равенства терпит неудачу в этом случае, заключается в том, что он пытается преобразовать тип. undefined
имеет тип undefined
, а null
имеет тип object
; в попытке сравнить эти два, Javascript преобразует оба в false
, поэтому он заканчивается тем, что считается равным. С другой стороны, тождественный оператор не выполняет преобразование типа и требует, чтобы типы были равны заключению равенства.
Изменить. Благодаря @user1600680 для указания, это не совсем правильно; спецификация ECMAScript определяет null-to- undefined как частный случай и равна. Нет промежуточного преобразования в false
.
<ч/" > Более простой пример преобразования типов - это число-строка:
console.log(5 == "5"); // true
console.log(5 === "5"); // false
В приведенном выше ответе есть хорошая цитата из Дугласа Крокфорда Javascript: The Good Parts:
[Оператор "==" делает] правильную вещь, когда операнды одного типа, но если они имеют разные типы, они пытаются принудить значения. правила, с помощью которых они делают, которые являются сложными и неподъемными.
Если вы не верите в то, что правила сложны и невосприимчивы, быстро просмотрите эти правила
будет лишить вас этого понятия.
Ответ 2
undefined
и null
имеют очень разные смысловые значения.
undefined
обычно означает "ответа не было", а null
означает "был ответ, и этот ответ был ничем".
Например, если я создал этот объект:
var gameState = {
state: loaded,
lastPlayer: null,
lastScore: null
};
Это не означает, что "я не знаю, кто был последним игроком", а означает "не был последним игроком".
Ответ 3
Чтобы прояснить предыдущий ответ, причина, по которой ==
работает таким образом, заключается в том, что в отличие от ===
он делает преобразование типа
Ответ 4
var a;
var b = null;
a является undefined, b полностью нулевым.
==
используется для сравнения для равенства сознательно свободным способом, что часто полезно
alert("3" == 3.0);
Это дает нам true
, хотя они явно отличаются друг от друга - один и несколько строк.
Много времени, хотя это здорово.
Аналогично, много времени не волнует, что что-то не имеет реального значения, потому что оно было undefined, или потому, что оно явно установлено в null.
В то время как полезно иногда, нам также иногда нужно знать точные совпадения типа, а также значение, поэтому мы также имеем ===
.
Ответ 5
Я также хочу сказать, что undefined
используется с typeof
.
Сравнение должно быть таким:
if( typeof(b)=="undefined" ){}
который дает те же результаты, что и
if( b === undefined ){}
и я включил эти дополнительные тесты в ваш код http://jsfiddle.net/A89Qj/5/
Ответ 6
Вам нужно использовать === вместо ==. Оператор === ведет себя так же, как и оператор ==, за исключением того, что он не выполняет никакого преобразования типов.
Ответ 7
typeof undefined - undefined, но тип null - это объект.
null === undefined даст вам ложь.
но null == undefined даст вам правду.
поскольку они имеют разные типы данных, но имеют одинаковую ценность.