Главная страница   /   4.8. Сравнение неопределенных и нулевых значений (Pro jQuery

Pro jQuery

Pro jQuery

Адам Фриман

4.8. Сравнение неопределенных и нулевых значений

В 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