Почему null является объектом и в чем разница между null и undefined?
-
03-07-2019 - |
Вопрос
Почему null
считается object
в JavaScript?
проверяет
if ( object == null )
Do something
такой же как
if ( !object )
Do something
?
А также:
В чем разница между null
и undefined
?
Решение
(name is undefined)
Ты: Что name
? (*)
JavaScript: name
?Что за name
?Я не знаю, о чем ты говоришь.Вы никогда не упоминали ни одного name
до.Видите ли вы какой-нибудь другой язык сценариев на (клиентской) стороне?
name = null;
Ты: Что name
?
JavaScript: Я не знаю.
Суммируя; undefined
там, где не существует понятия о вещи;у него нет типа, и на него никогда раньше не ссылались в этой области; null
известно, что вещь существует там, но неизвестно, какова ее ценность.
Следует помнить одну вещь: null
концептуально не то же самое, что false
или ""
или что-то в этом роде, даже если они приравниваются после приведения типов, т.е.
name = false;
Ты: Что name
?
JavaScript: Логическое значение ложь.
name = '';
Ты: Что name
?
JavaScript: Пустая строка
*: name
в этом контексте подразумевается переменная, которая никогда не была определена.Это может быть любая неопределенная переменная, однако имя является свойством практически любого элемента HTML-формы.Это произошло очень давно и было учреждено задолго до id.Это полезно, поскольку идентификаторы должны быть уникальными, а имена – не обязательно.
Другие советы
Разницу можно резюмировать в этом фрагменте:
alert(typeof(null)); // object
alert(typeof(undefined)); // undefined
alert(null !== undefined) //true
alert(null == undefined) //true
Проверка
object == null
это другое, чтобы проверить if ( !object )
.
Последний равен ! Boolean(object)
, потому что унарный !
оператор автоматически преобразует правильный операнд в логическое значение.
С Boolean(null)
равно ложь, тогда !false === true
.
Итак, если ваш объект не ноль, но ЛОЖЬ или 0 или "", чек пройдет, потому что:
alert(Boolean(null)) //false
alert(Boolean(0)) //false
alert(Boolean("")) //false
null
является не объект, это примитивное значение.Например, вы не можете добавлять к нему свойства.Иногда люди ошибочно полагают, что это объект, потому что typeof null
возвращает "object"
.Но на самом деле это ошибка (которая может быть даже исправлена в ECMAScript 6).
Разница между null
и undefined
как следует:
undefined
:используется JavaScript и означает «нет значения».Это значение имеют неинициализированные переменные, отсутствующие параметры и неизвестные переменные.> var noValueYet; > console.log(noValueYet); undefined > function foo(x) { console.log(x) } > foo() undefined > var obj = {}; > console.log(obj.unknownProperty) undefined
Однако доступ к неизвестным переменным приводит к исключению:
> unknownVariable ReferenceError: unknownVariable is not defined
null
:используется программистами для обозначения «нет значения», например.как параметр функции.
Исследование переменной:
console.log(typeof unknownVariable === "undefined"); // true
var foo;
console.log(typeof foo === "undefined"); // true
console.log(foo === undefined); // true
var bar = null;
console.log(bar === null); // true
Как правило, вы всегда должны использовать === и никогда == в JavaScript (== выполняет все виды конверсий это может привести к неожиданным результатам).Чек x == null
это крайний случай, потому что он работает для обоих null
и undefined
:
> null == null
true
> undefined == null
true
Распространенный способ проверить, имеет ли переменная значение, — преобразовать его в логическое значение и посмотреть, является ли оно true
.Это преобразование выполняется if
оператор и логический оператор !("нет").
function foo(param) {
if (param) {
// ...
}
}
function foo(param) {
if (! param) param = "abc";
}
function foo(param) {
// || returns first operand that can't be converted to false
param = param || "abc";
}
Недостаток этого подхода:Все следующие значения оцениваются как false
, поэтому вам следует быть осторожным (например, приведенные выше проверки не позволяют различить undefined
и 0
).
undefined
,null
- Логические значения:
false
- Числа:
+0
,-0
,NaN
- Струны:
""
Вы можете проверить преобразование в логическое значение, используя Boolean
как функция (обычно это конструктор, используемый с new
):
> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true
В чем разница между нулевым и неопределенным??
Свойство, если оно не имеет определения, является неопределенным.ноль — это объект.Его тип — объект.null — это специальное значение, означающее «нет значения».undefined не является объектом, его тип не определен.
Вы можете объявить переменную, установить для нее значение null, и поведение будет идентично, за исключением того, что вы увидите напечатанное значение «null» вместо «undef».Вы даже можете сравнить переменную, которая не определена, с нулевой или наоборот, и условие будет истинным:
undefined == null
null == undefined
Ссылаться на JavaScript Разница между нулевым и неопределенным для более подробной информации.
и с твоим новым редактировать да
if (object == null) does mean the same if(!object)
при проверке, является ли объект ложным, они оба соответствуют условию только при проверке, если ЛОЖЬ, но не тогда, когда это правда
Проверьте здесь: Ошибка Javascript
Первая часть вопроса:
Почему null считается объектом в JavaScript?
Это ошибка дизайна JavaScript, которую они сейчас не могут исправить.Это должен был быть тип null, а не тип object, или его вообще не было.Это требует дополнительной проверки (иногда забытой) при обнаружении реальных объектов и является источником ошибок.
Вторая часть вопроса:
проверяет
if (object == null)
Do something
такой же как
if (!object)
Do something
Обе проверки всегда являются ложными, за исключением:
объект не определен или равен нулю:оба верны.
объект примитивен и 0,
""
, или ложь:первая проверка ложь, вторая правда.
Если объект не является примитивом, а реальным объектом, например new Number(0)
, new String("")
, или new Boolean(false)
, то обе проверки ложны.
Таким образом, если «объект» интерпретируется как реальный объект, то обе проверки всегда одинаковы.Если примитивы разрешены, то проверки различны для 0, ""
, и ложь.
В таких случаях, как object==null
, неочевидные результаты могут быть источником ошибок.Использование ==
никогда не рекомендуется, используйте ===
вместо.
Третья часть вопроса:
А также:
В чем разница между нулевым и неопределенным?
В JavaScript одно отличие состоит в том, что null имеет тип объекта, а undef — неопределенный тип.
В JavaScript, null==undefined
имеет значение true и считается равным, если тип игнорируется.Почему они так решили, но 0, ""
и false не равны, я не знаю.Кажется, это произвольное мнение.
В JavaScript, null===undefined
неверно, поскольку тип должен быть одинаковым в ===
.
На самом деле null и undefined идентичны, поскольку оба представляют несуществование.Итак, сделайте 0 и ""
в этом отношении тоже, а может и пустые контейнеры []
и {}
.Так много типов одного и того же «ничто» — верный путь к ошибкам.Лучше один тип или вообще ничего.Я бы постарался использовать как можно меньше.
«Неверно», «Истинно» и «!» еще одна сумка червей, которые могут быть упрощены, например,, например, if(!x)
и if(x)
одних достаточно, вам не нужны истина и ложь.
Заявленный var x
имеет неопределенный тип, если значение не указано, но оно должно быть таким же, как если бы x вообще не объявлялся.Еще один источник ошибок — пустой контейнер «ничего».Поэтому лучше всего объявить и определить его вместе, например var x=1
.
Люди ходят кругами, пытаясь разобраться во всех этих разных вещах, но это все одно и то же в сложной разной одежде.Реальность такова
undefined===undeclared===null===0===""===[]==={}===nothing
И, возможно, всем следует генерировать исключения.
var x = null;
x определяется как ноль
y не определен;// потому что я это не определял
if (!x)
ноль оценивается как ложь
Один из способов разобраться в значениях null и undefine — понять, где они встречаются.
Ожидайте нулевое возвращаемое значение в следующих ситуациях:
Методы, опрашивающие DOM
console.log(window.document.getElementById("nonExistentElement")); //Prints: null
Ответы JSON, полученные по запросу Ajax
{
name: "Bob",
address: null
}
Новая функциональность, которая постоянно меняется.Следующее возвращает ноль:
var proto = Object.getPrototypeOf(Object.getPrototypeOf({}));
// But this returns undefined:
Object.getOwnPropertyDescriptor({}, "a");
Все остальные случаи несуществования обозначаются неопределенными (как отмечено @Axel).Каждое из следующих значений выводит «неопределено»:
var uninitalised;
console.log(uninitalised);
var obj = {};
console.log(obj.nonExistent);
function missingParam(missing){
console.log(missing);
}
missingParam();
var arr = [];
console.log(arr.pop());
Конечно, если вы решите написать var unitialized = null;или самостоятельно вернуть значение null из метода, то в других ситуациях у вас возникнет значение null.Но это должно быть довольно очевидно.
Третий случай — когда вы хотите получить доступ к переменной, но даже не знаете, объявлена ли она.В этом случае используйте typeof, чтобы избежать ошибки ссылки:
if(typeof unknown !== "undefined"){
//use unknown
}
В общем, проверяйте значение null, когда вы манипулируете DOM, работаете с Ajax или используете определенные функции ECMAScript 5.Во всех остальных случаях можно безопасно проверить неопределенность со строгим равенством:
if(value === undefined){
// stuff
}
Сравнение множества различных проверок на null в JavaScript:
http://jsfiddle.net/aaronhoffman/DdRHB/5/
// Variables to test
var myNull = null;
var myObject = {};
var myStringEmpty = "";
var myStringWhiteSpace = " ";
var myStringHello = "hello";
var myIntZero = 0;
var myIntOne = 1;
var myBoolTrue = true;
var myBoolFalse = false;
var myUndefined;
...trim...
http://aaron-hoffman.blogspot.com/2013/04/javascript-null-checking-undefined-and.html
Оба значения null и undefined являются ложными для равенства значений (null==undefined):они оба сбрасываются до логического значения false.Это разные объекты (null!==undefined).
undefined — это свойство глобального объекта («окна» в браузерах), но это примитивный тип, а не сам объект.Это значение по умолчанию для неинициализированных переменных и функций, заканчивающихся без оператора возврата.
null является экземпляром Object.null используется для методов DOM, которые возвращают объекты коллекции, чтобы указать пустой результат, который предоставляет ложное значение без указания на ошибку.
Некоторые уточнения:
нулевой и неопределенный являются два разных значения.Один представляет отсутствие значения имени, а другой — отсутствие имени.
Что происходит в if
происходит следующим образом для if( o )
:
Выражение в скобках o вычисляется, а затем if
запускает приведение типов к значению выражения в круглых скобках — в нашем случае o
.
Ложные (которые будут приведены к ложному) значениям в JavaScript: '', ноль, неопределенное, 0 и ложь.
Чтобы добавить к ответу В чем разница между undefined
и null
, из Полного руководства по JavaScript на этой странице:
Вы можете рассмотреть
undefined
представлять системный уровень, неожиданный или похожий на ошибку отсутствие значения иnull
представлять уровень программы, нормальный или ожидаемый отсутствие стоимости.Если вам нужно присвоить одно из этих значений с переменной или свойством или передать одно из этих значений функции,null
почти всегда правильный выбор.
Следующая функция показывает, почему, и способна выявить разницу:
function test() {
var myObj = {};
console.log(myObj.myProperty);
myObj.myProperty = null;
console.log(myObj.myProperty);
}
Если вы позвоните
test();
Вы получаете
неопределенный
нулевой
Первый console.log(...)
пытается получить myProperty
от myObj
пока он еще не определен - поэтому он возвращается «неопределенным».После присвоения ему значения null второй console.log(...)
возвращает, очевидно, «ноль», потому что myProperty
существует, но имеет значение null
назначено ему.
Чтобы иметь возможность запросить эту разницу, JavaScript имеет null
и undefined
:Пока null
есть - как и в других языках объект, undefined
не может быть объектом, поскольку нет экземпляра (даже null
экземпляр) доступен.
null
является объектом.Его тип равен нулю. undefined
не является объектом;его тип не определен.
Например window.someWeirdProperty
не определено, поэтому
"window.someWeirdProperty === null"
оценивается как ложь, в то время как
"window.someWeirdProperty === undefined"
оценивается как истина.
Кроме того, проверьте, если if (!o)
это не то же самое, что проверка if (o == null)
для o
существование false
.
Еще одна интересная особенность null по сравнению с undefined заключается в том, что его можно увеличивать.
x = undefined
x++
y = null
y++
console.log(x) // NaN
console.log(y) // 0
Это полезно для установки числовых значений по умолчанию для счетчиков.Сколько раз вы присваивали переменной значение -1 в ее объявлении?
В Javascript null
не является object
типа это primitave
тип.
В чем разница?
Неопределенный относится к указателю, который не был установлен.Нулевой относится к нулевому указателю, например, что-то вручную установило переменную типа null
Посмотри на это:
<script>
function f(a){
alert(typeof(a));
if (a==null) alert('null');
a?alert(true):alert(false);
}
</script>
//return:
<button onclick="f()">nothing</button> //undefined null false
<button onclick="f(null)">null</button> //object null false
<button onclick="f('')">empty</button> //string false
<button onclick="f(0)">zero</button> //number false
<button onclick="f(1)">int</button> //number true
<button onclick="f('x')">str</button> //string true
Из «Принципов объектно-ориентированного Javascript» Николаса К.Закас
Но почему объект, если тип имеет значение null?(На самом деле, это было признано ошибкой TC39, комитета, который разрабатывает и поддерживает JavaScript.Вы можете подумать, что null — это пустой указатель объекта, что делает «объект» логическим возвращаемым значением, но это все равно сбивает с толку.)
Закас, Николас С.(07.02.2014).Принципы объектно-ориентированного JavaScript (локации Kindle 226–227).Нет крахмального пресса.Киндл издание.
Это сказало:
var game = null; //typeof(game) is "object"
game.score = 100;//null is not an object, what the heck!?
game instanceof Object; //false, so it's not an instance but it's type is object
//let's make this primitive variable an object;
game = {};
typeof(game);//it is an object
game instanceof Object; //true, yay!!!
game.score = 100;
Неопределенный случай:
var score; //at this point 'score' is undefined
typeof(score); //'undefined'
var score.player = "felix"; //'undefined' is not an object
score instanceof Object; //false, oh I already knew that.
Лучший способ подумать о значении «null» — вспомнить, как подобное понятие используется в базах данных, где оно указывает, что поле «вообще не содержит значения».
- Да, стоимость предмета известна;это является 'определенный.' Это имеет был инициализирован.
- Стоимость предмета составляет: «нет никакой ценности».
Это очень полезный метод для написания программ, которые легче отлаживать.Неопределенная переменная может быть результатом ошибки... (откуда ты знаешь?) ...но если переменная содержит значение «null», вы знаете, что «кто-то где-то в этой программе установить его на «ноль». Поэтому я советую, когда вам нужно избавиться от значения переменной, не «удалять»…Установите его на «null». Старая стоимость будет осиротежна и скоро будет сборка мусора;Новое значение: «Нет значения (сейчас)». В обоих случаях состояние переменной определенно:«Очевидно, что это было сделано намеренно».
- Неопределенное означает, что переменная была объявлена, но ей не было присвоено какое-либо значение, в то время как значение Null может быть присвоено переменной, представляющей «нет значения». (Null — это оператор присваивания).
2.Undefine — это сам тип, а Null — это объект.
3. Javascript сам может инициализировать любую неназначенную переменную как неопределенную, но никогда не может установить значение переменной равным нулю.Это должно быть сделано программно.