开发者问题收集

为什么 null 是一个对象以及 null 和 undefined 有什么区别?

2009-04-29
617280

为什么在 JavaScript 中 null 被视为 对象

检查

if ( object == null )
      Do something

是否与检查

if ( !object )
      Do something

相同?

此外:

nullundefined 之间有什么区别?

3个回答
(name is undefined)

您: 什么是 name (*)
JavaScript: name ?什么是 name ?我不知道您在说什么。您之前从未提到过任何 name 。您是否在(客户端)端看到了其他脚本语言?

name = null;

您: 什么是 name
JavaScript: 我不知道。

简而言之; undefined 表示不存在任何事物的概念;它没有类型,并且从未在该范围内被引用过; null 表示已知事物存在,但不知道其值是什么。

需要记住的一点是, null 在概念上与 false"" 等不同,即使它们在类型转换后相等,即

name = false;

您: name 是什么?
JavaScript: 布尔值 false。

name = '';

您: name 是什么?
JavaScript: 空字符串


*: name 在此上下文中表示从未定义的变量。它可以是任何未定义的变量,但是,name 是几乎任何 HTML 表单元素的属性。它的历史可以追溯到很久以前,早在 id 之前就已存在。它很有用,因为 id 必须是唯一的,但名称不必如此。

Rob
2009-04-29

差异可以总结为以下代码片段:

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,因此 !false === true

因此,如果您的对象 不是 null 而是 false 0 "" ,则检查将通过,因为:

alert(Boolean(null)) //false
alert(Boolean(0))    //false
alert(Boolean(""))   //false
kentaromiura
2009-04-29

null 不是对象 ,它是一个 原始值 。例如,您无法向其添加属性。有时人们会错误地认为它是一个对象,因为 typeof null 返回 "object" 。但这实际上是一个错误(甚至可能在 ECMAScript 6 中得到修复)。

nullundefined 之间的区别如下:

  • 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 未定义
    
  • 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 是一个边缘情况,因为它适用于 nullundefined

> 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 ,因此您必须小心(例如,上述检查无法区分 undefined0 )。

  • undefinednull
  • 布尔值: false
  • 数字: +0-0NaN
  • 字符串: ""

您可以使用 Boolean 作为函数(通常它是一个构造函数,与 new 一起使用)来测试转换为布尔值:

> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true
Axel Rauschmayer
2011-11-01