Разница между нулем и undefined в JavaScript? - программирование

Разница между нулем и 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.

4b9b3361

Ответ 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 даст вам правду. поскольку они имеют разные типы данных, но имеют одинаковую ценность.