协慌网

登录 贡献 社区

为什么 null 是一个对象,null 和 undefined 之间有什么区别?

为什么null被认为是 JavaScript 中的object

正在检查

if ( object == null )
      Do something

同样的

if ( !object )
      Do something

并且:

nullundefined什么区别?

答案

(name is undefined)

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

name = null;

你: name是什么?
JavaScript:我不知道。

简而言之; undefined是没有概念存在的地方; 它没有类型,并且在该范围之前从未被引用过; null是已知存在的东西,但不知道该值是什么。

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

name = false;

你: name是什么?
JavaScript: Boolean false。

name = '';

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


*:此上下文中的name表示从未定义过的变量。它可以是任何未定义的变量。但是,name 是几乎任何 HTML 表单元素的属性。它顺便说一下,并且在 id 之前很好地制定了。它很有用,因为 id 必须是唯一的,但名称不必是。

差异可以归纳为这个片段:

alert(typeof(null));      // object
alert(typeof(undefined)); // undefined

alert(null !== undefined) //true
alert(null == undefined)  //true

检查

object == null不同于检查if ( !object )

后者等于! Boolean(object) ,因为一元! operator 自动将右操作数转换为布尔值。

由于Boolean(null)等于 false,因此!false === true

因此,如果您的对象不为 null但为 false0“” ,则检查将通过,因为:

alert(Boolean(null)) //false
alert(Boolean(0))    //false
alert(Boolean(""))   //false

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 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 中使用 === 和 never ==(== 执行可能产生意外结果的各种转换 )。检查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作为函数来测试转换为 boolean(通常它是一个构造函数,与new一起使用):

> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true