Сравнение неопределенных и нулевых значений
В JavaScript есть несколько специальных значений, и нужно быть очень осторожными при их сравнении. Это значения undefined
и null
. Значение undefined
возвращается в том случае, если вы пытаетесь прочесть значение переменной, которой оно не было присвоено, или пытаетесь прочесть свойство объекта, которое не существует. В листинге 4-34 показано, как undefined
используется в JavaScript.
Листинг 4-34: Значение undefined
<!DOCTYPE HTML>
<html>
<head>
<title>Example</title>
<script type="text/javascript">
var myData = {
name: "Adam",
weather: "sunny",
};
console.log("Prop: " + myData.doesntexist);
</script>
</head>
<body>
This is a simple example
</body>
</html>
Результат листинга такой:
Prop: undefined
Странность JavaScript заключается в том, что он также определяет другое специальное значение, null
. Значение null
немного отличается от значения undefined
. Значение undefined
возвращается в том случае, если значение не определено; а null
используется тогда, когда вы хотите указать, что вы присвоили значение, но это значение не принадлежит типам object
, string
, number
или boolean
; то есть вы присвоили значение без значения. Чтобы немного прояснить этот момент, я показал в листинге 4-35 переход от undefined
к null
.
Листинг 4-35: Использование undefined и null
<!DOCTYPE HTML>
<html>
<head>
<title>Example</title>
<script type="text/javascript">
var myData = {
name: "Adam",
};
console.log("Var: " + myData.weather);
console.log("Prop: " + ("weather" in myData));
myData.weather = "sunny";
console.log("Var: " + myData.weather);
console.log("Prop: " + ("weather" in myData));
myData.weather = null;
console.log("Var: " + myData.weather);
console.log("Prop: " + ("weather" in myData));
</script>
</head>
<body>
This is a simple example
</body>
</html>
Я создал объект и попытался прочесть значение свойства weather
, которое не определено:
console.log("Var: " + myData.weather);
console.log("Prop: " + ("weather" in myData));
Свойство weather
не существует, поэтому значение, возвращенное при вызове myData.weather
, будет undefined
. А использование ключевого слова in
, чтобы определить, существует ли такое свойство, возвращает false
. Результат этих двух выражений такой:
Var: undefined
Prop: false
Потом я присвоил значение свойству weather
, вследствие чего это свойство было добавлено в объект:
myData.weather = "sunny";
console.log("Var: " + myData.weather);
console.log("Prop: " + ("weather" in myData));
Я снова прочел значение свойства и проверил, существует ли это свойство для объекта. Как и следовало ожидать, в объекте определено свойство и оно имеет значение sunny
:
Var: sunny
Prop: true
Затем я присвоил свойству значение null
, вот таким образом:
myData.weather = null;
И это привело к довольно интересному результату. Свойство все еще определено в объекте, но оно не содержит значения. Когда я снова сделал свою проверку, я получил следующий результат:
Var: null
Prop: true
Это различие важно, когда дело доходит до сравнения undefined
и null
значений, потому что сами по себе null
– это object
, а undefined
– тип.
Проверяем, является ли переменная или свойство null или undefined
Если вы хотите проверить, является ли свойство null
или undefined
, тогда вы просто можете использовать оператор if
и оператор отрицания (!
), как показано в листинге 4-36.
Листинг 4-36: Проверяем, является ли свойство undefined или null
<!DOCTYPE HTML>
<html>
<head>
<title>Example</title>
<script type="text/javascript">
var myData = {
name: "Adam",
city: null
};
if (!myData.name) {
console.log("name IS null or undefined");
} else {
console.log("name is NOT null or undefined");
}
if (!myData.city) {
console.log("city IS null or undefined");
} else {
console.log("city is NOT null or undefined");
}
</script>
</head>
<body>
This is a simple example
</body>
</html>
Этот способ основывается на принудительном приведении типа к булевской величине, то есть JavaScript обращается с проверяемыми значениями как со значениями boolean. Если переменная или свойство являются null
или undefined
, тогда значение boolean будет false
.
Различия между null или undefined
Если вы хотите сравнить два значения, вы можете сделать это следующим образом. Если вы хотите обращаться со значением undefined
так же, как и со значением null
, вы можете использовать оператор равенства (==
) и быть уверенными в том, что JavaScript преобразует типы. undefined
переменная будет рассматриваться как равная переменной null
. Если вы хотите разграничить null
и undefined
, тогда нужно использовать оператор тождества (===
). В листинге 4-37 показаны оба этих подхода.
Листинге 4-37: Проверка на равенство и тождество null и undefined значений
<!DOCTYPE HTML>
<html>
<head>
<title>Example</title>
<script type="text/javascript">
var firstVal = null;
var secondVal;
var equality = firstVal == secondVal;
var identity = firstVal === secondVal;
console.log("Equality: " + equality);
console.log("Identity: " + identity);
</script>
</head>
<body>
This is a simple example
</body>
</html>
Результат выполнения скрипта такой:
Equality: true
Identity: false