为什么null为对象,并且null和undefined有什么区别?


866

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

正在检查

if ( object == null )
      Do something

与...相同

if ( !object )
      Do something

并且:

null和之间有什么区别undefined


6
如果标题中添加了最后一个问题,那就太好了。这里的答案很棒,但是标题可能并不表明您可以在这里找到答案
marcos.borunda 2012年

6
空不是JavaScript中的对象!typeof null === 'object'但这是一个错误!这是一个链接,观看所有视频并欣赏:)
CoR 2015年

1
我喜欢使用C / C ++作为未定义和NULL值变量的公理,因为它非常简单。然后查看这些定义如何与其他语言的规范进行比较。
samis

Answers:


1488
(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必须是唯一的,但名称不必是唯一的。


14
但是在JavaScript中,空字符串”仍为布尔值false。
Andreas Grech

117
空字符串不是布尔值false,但在条件条件下将其解释为false(y)值(强制)。
布赖恩·马修斯

22
对于第二种情况,其中name = null,而不是“我不知道”,JavaScript可以回答:null对象。除此之外,我喜欢答案的风格。
Jean Vincent

16
与其说“我不知道”,不如说答案null是“没有”。Null精确定义为无值。虚无,娜达。没有。
mikl 2011年

50
喜欢那种回答方式。总的来说,“您从未有过提及 name 。但是,声明变量而不给它赋值(var somevar;)仍然会令人惊讶地产生undefined
MC皇帝

142

区别可以总结为以下代码段:

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

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

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

@kentaromiura对我们来说Javascript noobs ...也许只有我...这个Boolean(value)语法是什么?转换为布尔值?
xr280xr 2012年

@ xr280xr是的,正在投射。尝试String(null)查看铸造的另一个示例。您甚至可以做类似Number(null + 2)...之类的愚蠢的事情,但您不应该:-)。kentaromiura的出色回答。
squidbe

记住typeof是一个运算符。出于与您不会编写相同的原因,您不会将操作数包装在括号中var sum = 1 +(1);
Alex

124

null不是一个对象,它是一个原始值。例如,您不能向其添加属性。有时人们会错误地认为它是一个对象,因为typeof nullreturn "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是一种极端情况,因为它适用于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

1
为什么参考+0-0seperately如果+0 === -0
雷诺斯

6
可能是因为您仍然可以区分+0-01/+0 !== 1/-0

1
该答案链接到一个帖子,该帖子链接到该答案作为源……可能意味着链接到了2ality.com/2013/10/typeof-null.html
Ricardo Tomasi

哦,对了,就像在C中一样,未初始化的变量声明被认为是未定义的(旧版本实际上可能包含以前的程序数据)。
samis

5
“但这实际上是一个错误(甚至可以在ECMAScript 6中修复)” –源?
朱斯(Gajus)'17年

26

null和undefined有什么区别?

没有定义的属性未定义。null是一个对象。它的类型是对象。null是一个特殊值,表示“无值。undefined不是对象,类型是undefined。

您可以声明一个变量,将其设置为null,其行为是相同的,除了看到的是“ null”而不是“ undefined”。您甚至可以将未定义的变量与null进行比较,反之亦然,条件将为true:

 undefined == null
 null == undefined

有关更多详细信息,请参阅JavaScript与null和undefined之间的区别

和您的新编辑

if (object == null)  does mean the same  if(!object)

在测试object是否为false时,它们都仅在测试false时满足条件,而在true 时不满足条件

检查这里:Javascript陷阱


4
您应该使用===,然后使用undefined!== null:D
olliej

1
注意最后一部分,不正确,请参阅我的答案;)
kentaromiura

6
!object与“ object == null”不同...实际上,它们是完全不同的。如果object为0,空字符串,布尔值false,未定义或null,则!object将返回true。
詹姆斯

3
null真的是对象吗?您提供的第一个链接按typeof检查是否为null,但是由于语言设计错误,typeof(null)评估为“对象”。
c4il's

2
null不是对象。这typeof null == 'object';返回true,是因为不能固定在JavaScript中的错误(现,但在将来可能会改变)。
Mohamad 2014年

21

问题的第一部分:

为什么在JavaScript中将null视为对象?

这是一个JavaScript设计错误,目前无法修复。它应该是null类型,而不是object类型,或者根本没有。在检测真实对象时,它需要进行额外的检查(有时被遗忘),并且是错误的来源。

问题的第二部分:

正在检查


if (object == null)
Do something



if (!object)
Do something

除以下几点外,这两项检查始终均为假:

  • object未定义或为null:均为true。

  • object是基本类型,并且为0,""或false:第一次检查false,第二次检查true。

如果对象是不是一个原始的,而是一个真正的对象,如new Number(0)new String("")new Boolean(false),那么这两个检查都是假的。

因此,如果“对象”被解释为表示真实对象,则两个检查始终相同。如果允许使用原语,则对于0 "",和false 的检查是不同的。

在类似object==null的情况下,不明显的结果可能是错误的来源。使用==不推荐过,用===代替。

问题的第三部分:

还有:

null和undefined有什么区别?

在JavaScript中,一个区别是null为object类型,而undefined为undefined类型。

在JavaScript中null==undefined为true,并且如果类型被忽略,则视为相等。他们""不知道为什么会这样,但是0 和false不相等。这似乎是一个任意看法。

在JavaScript中,这null===undefined是不正确的,因为类型必须与中的相同===

实际上,null和undefined是相同的,因为它们都表示不存在。因此也为0,""也可能是空容器[]{}。如此多的相同类型的东西都是导致错误的良方。一种或根本没有更好。我会尝试使用尽可能少的。

'false','true'和'!' 是可以简化,例如蠕虫的另一个袋子,if(!x)if(x)单是足够了,你不需要真假。

var x如果没有给出值,则声明的类型为undefined,但是它应该与x从未声明过一样。另一个错误源是一个空的无容器。因此,最好像一样一起声明和定义它var x=1

人们四处走动,试图找出所有这些类型的虚无,但都是一件复杂而又不同的衣服。现实是

undefined===undeclared===null===0===""===[]==={}===nothing

也许所有人都应该抛出异常。


8
很好的答案,但与[]有点太过分了:“ 实际上,null和undefined是相同的……甚至可能是空容器[]和{}。 ”您可能会说服我以为{}应该是一些null的味道,但我的直觉是不应该的。但是争议较少的是,一个空数组可以[]理解为具有一个.push()函数,因此[]为空没有很好的论据。0.02美元。
松饼

11
var x = null;

x定义为null

y未定义;//因为我没有定义它

if (!x)

null被评估为false


8

理解null和undefined的一种方法是了解每种情况的发生位置。

在以下情况下,期望返回空值:

  • 查询DOM的方法

    console.log(window.document.getElementById("nonExistentElement"));
    //Prints: null
  • 从Ajax请求收到的JSON响应


    {
      name: "Bob",
      address: null
    }
  • RegEx.exec

  • 不断变化的新功能。以下返回null:


        var proto = Object.getPrototypeOf(Object.getPrototypeOf({}));

       // But this returns undefined:

        Object.getOwnPropertyDescriptor({}, "a");

所有其他不存在的情况都由undefined表示(如@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
}

总而言之,在处理DOM,处理Ajax或使用某些ECMAScript 5功能时,请检查是否为null。对于所有其他情况,可以使用严格的相等性检查undefined是安全的:

if(value === undefined){
  // stuff
}

8

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

JavaScript空检查比较表


1
做“ var myUndefined;” 定义变量(作为未知类型的已知变量)?
齐帆

6

对于值相等,null和undefined均为false(null == undefined):它们都折叠为布尔值false。它们不是同一对象(null!== undefined)。

undefined是全局对象的属性(浏览器中为“窗口”),但它是原始类型,而不是对象本身。这是未初始化的变量和函数的默认值,这些变量和函数以没有return语句的结尾结束。

null是Object的实例。对于用于返回集合对象以指示为空结果的DOM方法,将使用null,该方法提供错误值而不指示错误。


5

一些精度:

null和undefined 两个不同的值。一个代表缺少名称的值,而另一个代表缺少名称。


发生if以下情况if( o )

对括号o中的表达式进行求值,然后if对括号中的表达式的值进行类型强制-在本例中为踢o

JavaScript中的Falsy(将被强制转换为false)的值为:”,null,undefined,0和false


5

要添加到的答案之间有什么differrence undefinednull,从JavaScript的权威指南第6版,在此页第41页

您可能会考虑undefined表示系统级别的,意外的或类似错误的值null缺失,并表示程序级别的,正常的或预期的值缺失。如果您需要将这些值之一分配给变量或属性,或者将这些值之一传递给函数,null则几乎总是正确的选择。


3

null是一个对象。其类型为null。undefined不是对象 其类型未定义。


11
错误-两者nullundefined都是原始值- typeof null === 'object'是语言错误,因为Object(null) !== null
Christoph

不,不是。Object()以这种方式进行转换,请参见ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf-15.2.2.1 new Object([value])... 8.(参数值未提供或其类型为Null或未定义。)创建一个新的本机ECMAScript对象。新建对象的[[Prototype]]属性设置为Object原型对象。新建对象的[[Class]]属性设置为“对象”。新构造的对象没有[[Value]]属性。返回新创建的本机对象。
kentaromiura

3
@Christoph:我的意思是,你是对的。null 应该是一种类型,我的意思是您不能以这种方式检查它,因为:alert(new Object()!== new Object()); / *是的,新的等距不是相同的等距/ alert(Object(null).constructor == {} .constructor); / true如spec / alert(Object(null).prototype == {} .prototype); / true如spec / alert(null instanceof Object)中所述;/显然为false,null表示未实例化* /但基本上是XD的规范错误,请参见:uselesspickles.com/blog/2006/06/12/…javascript.crockford.com/remedial.html
kentaromiura 2009年

2

以下功能说明了原因并能够解决差异:

function test() {
        var myObj = {};
        console.log(myObj.myProperty);
        myObj.myProperty = null;
        console.log(myObj.myProperty);
}

如果你打电话

test();

你正在

未定义

空值

第一个console.log(...)尝试myPropertymyObj尚未定义的位置获取数据-因此它返回“未定义”状态。在为它分配了null之后,第二个console.log(...)返回值显然是“ null”,因为myProperty它存在,但是它已经为其null分配了值。

为了能够查询这种差异,JavaScript具有nullundefined:尽管null是-与其他语言一样,对象undefined也不能是对象,因为没有可用的实例(甚至不是null实例)。


2

例如window.someWeirdProperty是未定义的,所以

"window.someWeirdProperty === null" 评估为false

"window.someWeirdProperty === undefined" 评估为true。

此外checkif if (!o)是不一样的检查if (o == null)ofalse


您能详细说明两个条件之间的区别吗?
rahul

读我的答案,他的意思是如果o等于0,false或“”,则布尔值为false:var undef,different = [0,“”,null,false,undef]; for(各种var obj){alert(!obj); // IE中有4次错误,FF中有5次;)}
kentaromiura

2

与undefined相比,null的另一个有趣之处在于它可以递增。

x = undefined
x++
y = null
y++
console.log(x) // NaN
console.log(y) // 0

这对于设置计数器的默认数值很有用。您在变量声明中将变量设置为-1多少次?


2

Java语言 null不是一种object类型,而是一种primitave类型。

有什么区别? 未定义是指尚未设置的指针。 Null表示空指针,例如某些东西已手动将变量设置为typenull


2

看这个:

   <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

1

摘自Nicholas C. Zakas的“面向对象Javascript的原理”

但是为什么类型为null的对象呢?(实际上,这是设计和维护JavaScript的委员会TC39确认为错误。您可能会认为null为空对象指针,使“对象”成为逻辑返回值,但这仍然令人困惑。)

扎卡斯(Nicholas C.)(2014-02-07)。面向对象JavaScript的原理(Kindle位置226-227)。没有淀粉新闻。Kindle版。

说:

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.

1

考虑“空”的最好方法是回忆一下在数据库中如何使用类似的概念,它表示一个字段“根本没有任何值”。

  • 是的,该物品的价值是已知的;它 “定义的”。它被初始化。
  • 该项目的值是:“没有值”。

这对于编写更易于调试的程序是非常有用的技术。“未定义”变量可能是错误的结果…… (您怎么知道?) ……但是,如果变量包含值“ null”,则您会知道“有人在该程序的某个位置,将其设置为因此,我建议当您需要删除变量的值时,请不要“删除”,而是将其设置为“空”。旧值将被孤立,不久将被垃圾回收;新值是“没有值(现在)”。在这两种情况下,变量的状态都是确定的:“显然,它是故意这样做的。”


1
  1. 未定义表示已声明变量,但尚未分配任何值,而可以将Null分配给表示“无值”的变量。(Null是赋值运算符)

2. Undefined是类型本身,而Null是对象。

3. Javascript本身可以将任何未分​​配的变量初始化为undefined,但永远不能将变量的值设置为null。这必须以编程方式完成。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.