什么时候在JavaScript中使用null或undefined?

我真的很困惑,当JavaScript返回nullundefined 。 另外不同的浏览器似乎是以不同的方式返回。

你可以给一些null / undefined例子返回它们的浏览器。

虽然我现在明确了这个undefined方面,但我仍然没有100%清楚。 这与空白值相似吗?

例如,您有一个没有设置任何值的文本框。 现在当你试图访问它的值时,它会是null还是undefined ,它们是否相似?

当调用没有返回节点对象时,DOM方法getElementById()nextSibling()childNodes[n]parentNode()等返回null (已定义但没有值)。

属性已定义,但它所引用的对象不存在。

这是你可能不想testing平等的less数几次之一,

if(x!==undefined)对于空值将为真

但是if(x!= undefined)对于没有undefined值或为null值将是真(仅)。

我发现其中的一些答案是模糊而复杂的,我发现找出这些东西的最好办法就是打开控制台并自己testing一下。

 var x; x == null // true x == undefined // true x === null // false x === undefined // true var y = null; y == null // true y == undefined // true y === null // true y === undefined // false typeof x // 'undefined' typeof y // 'object' var z = {abc: null}; z.abc == null // true z.abc == undefined // true z.abc === null // true z.abc === undefined // false z.xyz == null // true z.xyz == undefined // true z.xyz === null // false z.xyz === undefined // true null = 1; // throws error: invalid left hand assignment undefined = 1; // works fine: this can cause some problems 

所以这绝对是JavaScript的细微差别之一。 正如你所看到的,你可以覆盖undefined的值,与null相比,它有点不可靠。 使用==运算符,您可以可靠地使用nullundefined可以互换,据我所知。 但是,由于null不能被重新定义的优点,我可能会在使用==时使用它。

例如,如果variable等于nullundefined ,则variable != null将始终返回false;而如果variable等于nullundefined ,则variable != undefined将返回false。UNLESS undefined被预先重新分配。

如果您需要确保某个值实际上是undefined (而不是null ),则可以可靠地使用===运算符来区分undefinednull

根据ECMAScript 5规范:

  • NullUndefined是六种内置types中的两种。

4.3.9未定义的值

当一个variables没有被赋值时使用原始值

4.3.11空值

表示故意不存在任何对象值的原始值

你得到了不确定的各种情况:

你用var声明一个variables,但从来没有设置它。

 var foo; alert(foo); //undefined. 

您尝试访问您从未设置的对象的属性。

 var foo = {}; alert(foo.bar); //undefined 

您尝试访问从未提供的参数。

 function myFunction (foo) { alert(foo); //undefined. } 

正如cwolves在对另一个答案的评论中指出的那样,函数不会返回一个值。

 function myFunction () { } alert(myFunction());//undefined 

一个空值通常必须被有意地设置在一个variables或属性上(参见注释可以在没有设置的情况下出现)。 另外,null是typesobject ,undefinedtypes是undefined

我还应该注意,null在JSON中是有效的,但是undefined不是:

 JSON.parse(undefined); //syntax error JSON.parse(null); //null 

我可能会错过一些东西,但是afaik,你只能得到undefined

更新:好吧,我错过了很多,试图完成:

你得到undefined

…当您尝试访问不存在的对象的属性时:

 var a = {} a.foo // undefined 

…当你声明一个variables但没有初始化它:

 var a; // a is undefined 

…当你访问没有值传递的参数时:

 function foo (a, b) { // something } foo(42); // b inside foo is undefined 

…当一个函数没有返回一个值时:

 function foo() {}; var a = foo(); // a is undefined 

这可能是因为某些内置函数在出现某个错误时返回null ,但是如果是这样的话,就会logging下来。 null是JavaScript中的一个具体值, undefined不是。


通常你不需要区分这些。 根据variables的可能值,使用if(variable)来testing一个值是否被设置就足够了( nullundefined值都是false )。

另外不同的浏览器似乎是以不同的方式返回。

请举一个具体的例子。

关于这个主题,规范(ecma-262)很清楚

我发现它非常有用和直接,所以我分享它: – 在这里,你会发现等式algorithm – 在这里,你会发现严格的相等algorithm

我从Mozilla开发者网站上看到了“抽象的平等,严格的平等,相同的价值”一节,节同一性。

希望对你有帮助。

没有定义的属性是未定义的。 null是一个对象。 它的types是null。 undefined不是一个对象,它的types是未定义的。

这是一篇很好的文章,解释了这个差异,并给出了一些例子。

null与undefined