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

Why is null an object and what's the difference between null and undefined?

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

正在检查

1
2
if ( object == null )
      Do something

一样

1
2
if ( !object )
      Do something

还有:

nullundefined有什么区别?

  • 如果在标题中加上最后一个问题,那就太好了。这里的答案很不错,但是标题可能没有指出你会在这里找到这个答案。
  • 空不是javascript中的对象!typeof null === 'object'但是那是一个错误!这里有一个链接,观看所有视频并欣赏:)
  • 我喜欢用C/C++作为一个公理化的真理,对于一个未定义的和空值的变量是什么,因为它是非常简单的。然后看看这些定义如何与其他语言的规范进行比较。


1
(name is undefined)

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

1
name = null;

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

简而言之,undefined是不存在事物概念的地方;它没有类型,以前从未在这个范围内被引用过;null是事物已知存在的地方,但它不知道价值是什么。

要记住的一件事是,从概念上讲,nullfalse""等不同,即使它们在类型转换后等同,即

1
name = false;

你:什么是name?javascript:布尔值错误。

1
name = '';

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

*:name在此上下文中是指从未定义的变量。它可以是任何未定义的变量。但是,name是几乎所有HTML表单元素的属性。它在ID之前就已经建立了。它很有用,因为ID必须是唯一的,但名称不一定是唯一的。

  • 但是在javascript中,空字符串""仍然是布尔值false。
  • 空字符串不是布尔值false,但在条件的上下文中,它被解释为假(y)值(强制)。
  • 对于第二种情况,其中name=null,而不是'I don't know',javascript可以回答:空对象。除此之外,我喜欢这个答案的风格。
  • 与其说"我不知道",我更愿意说,对null的回答是"没什么"。空值精确定义为无值。无效,零,纳达。没有什么。
  • 喜欢那种回答方式。一般来说,"你以前从来没有提到过任何name"是正确的。然而,声明一个变量而不给它赋值(var somevar;),仍然会令人惊讶地导致undefined
  • @mc emperon-另外,您可以显式地将声明的变量设置为undefined,因此我同意"您以前从未提到过任何name"有点误导性。
  • 这并不能回答以下问题:"(object==null)与(!对象)
  • 我一直认为未定义和空值一样。但现在我意识到未定义几乎就像一个空值的空值。
  • >您是否在(客户端)方面看到其他脚本语言?哈哈哈哈
  • @当你考虑德克劳·克劳和德克劳·费恩之间的区别时,这并不奇怪。var somevar是一个变量声明(内存中的一个保留区域),而var somevar = 'foo'是一个变量分配或定义,如果您愿意的话。如果您试图引用"somevar"的值,javascript会保留空间,因此知道变量存在,但是由于没有进行赋值,javascript会通过返回"undefined"让您知道"somevar"只作为声明存在。这真的是唯一明智的选择。
  • 在Chrome控制台上测试了它,并注意到以下问题:初始化var name = null;。第一次试验:name == null; // => false;第二次试验:name == 'null'; // => true。这是真的,因为typeof(name) = 'string'。变量name隐式地是一个字符串。多么微妙啊!
  • @AndreasGrech:[false]实际上不是["],如果您将==放在两者之间
  • @当然,这是因为===不做类型强制。
  • 我相信你的解释并不完全正确(不过我也可能是错的)。Undefined是不知道值时应使用的值。car is undefined意味着javascript不知道汽车的价值,但它知道什么是汽车。空表示没有值,没有相关值。car = null表示根本没有汽车。所以你所定义的空实际上是未定义的,空是完全不同的。
  • @在javascript中,空字符串不是布尔值false。当使用强制时,它只计算为布尔值false。
  • 多么愚蠢的语言行为。
  • 喜欢讲故事的方法:D
  • type of要求javascript提供变量值的类型,而不是变量本身。当没有变量被声明时,javascript会抛出一个引用错误。这应该是你对话的第一行,JS没有听说你提到的任何"名字"。如果声明一个变量,但不赋值,或者如果赋值未定义,则表示该对象存在,但它没有值,因此该值的类型未定义。另一方面,空会导致问题。"空"的意思应该是"没有价值",但如果你要求输入typeof null,你会得到"对象"wat。
  • 我同意tiddo的观点,并建议值为undefined的原因是不明确的,而null就像是说"这个空格故意留空"。
  • name是window的一个部分保护(它只能是一个字符串)属性。
  • 在javascript/ecmascript中没有is关键字,更不用说是一个运算符了,是吗?我指的是(name is undefined)的表达。


差异可以概括为以下几点:

1
2
3
4
5
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或",则检查将通过因为:

1
2
3
alert(Boolean(null)) //false
alert(Boolean(0))    //false
alert(Boolean(""))   //false

  • +1,解释一下!布尔(对象)
  • @Kentaromiura对于我们的javascript noobs…也许只有我…这个布尔(值)语法是什么?铸造一个布尔?
  • @xr280xr是的,这是铸造。尝试使用String(null)查看另一个铸造示例。你甚至可以做一些愚蠢的事情,比如Number(null + 2)…但你不应该:—)。肯塔罗米拉的回答很好。
  • 记住,typeof是一个运算符。您不会将操作数括在括号中,原因与您不会写入var sum = 1 +(1);的原因相同。


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

nullundefined的区别如下:

  • undefined:由javascript使用,表示"无值"。未初始化的变量、缺少的参数和未知变量都具有该值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    > var noValueYet;
    > console.log(noValueYet);
    undefined

    > function foo(x) { console.log(x) }
    > foo()
    undefined

    > var obj = {};
    > console.log(obj.unknownProperty)
    undefined

    但是,访问未知变量会产生一个异常:

    1
    2
    > unknownVariable
    ReferenceError: unknownVariable is not defined
  • null:程序员用来表示"无值",例如作为函数的参数。

检查变量:

1
2
3
4
5
6
7
8
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两种情况:

1
2
3
4
> null == null
true
> undefined == null
true

检查变量是否有值的一种常见方法是将其转换为布尔值,并查看它是否为true。转换由if语句和布尔运算符执行!("不")。

1
2
3
4
5
6
7
8
9
10
11
12
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)。

  • 江户十一〔23〕、江户十一〔19〕。
  • 布尔值:false
  • 编号:+0-0NaN
  • 字符串:""

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

1
2
3
4
5
6
7
8
9
10
> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true

  • 如果+0 === -0,为什么分别引用+0-0
  • 可能是因为你仍然可以区分+0-01/+0 !== 1/-0
  • 此答案链接到作为源链接回此答案的文章…可能是想链接到2ality.com/2013/10/typeof-null.html
  • 哦,对了,就像在C中一样,未初始化的变量声明被认为是未定义的(旧版本实际上可以包含以前的程序数据)。
  • 程序员也可以用undefined表示"无值",而js也可以用null表示"无值"。
  • @Axel Raoschmayer我不怪你。Netscape程序员,直到最近一直都是错的。我相信它在火狐5或更高版本中被修正了。他们不知道空是对缺少的属性、方法、对象引用的补充,而未定义的是:缺少的值。未定义的是typeles,空的不是。空表示未定义的对象未定义的基元。这就是为什么在类型转换时,只有空==undefined>true,但没有其他错误的原语或对象。这是因为当您从空中去掉类型时——剩下的是一个未定义的裸类型。
  • "但这实际上是一个bug(甚至可以在EcmaScript 6中修复)"—来源?
  • 我想是@neo。
  • 它永远不会被修复。如果修复了,所有的互联网都会崩溃。这和Nan的问题是一样的。


What is the difference between null and undefined??

没有定义的属性是未定义的。空是一个对象。它的类型是对象。空是一个特殊值,意思是"没有值"。未定义不是对象,它的类型未定义。

您可以声明一个变量,将其设置为空,并且行为是相同的,除了您将看到打印出的"空"和"未定义"之外。甚至可以将未定义的变量与空变量进行比较,反之亦然,条件将为真:

1
2
 undefined == null
 null == undefined

有关详细信息,请参阅空值和未定义值之间的javascript差异。

你的新编辑是的

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

当测试对象是否为假时,它们都只满足测试对象是否为假时的条件,而不满足测试对象是否为真时的条件。

检查这里:javascript gotcha

  • 你应该使用==,然后不定义!=空:D
  • 注意最后一部分,不正确见我的答案;)
  • !对象与"object==null"不同…事实上,它们是完全不同的。!如果is object为0、空字符串、布尔值false、未定义或为空,则object将返回true。
  • 空值真的是一个对象吗?您提供的第一个链接按typeof检查空值,但typeof(空值)由于语言设计错误而计算为"object"。
  • @tstamper:那个"javascript gotcha"(blog.poundbang.in/post/30056940/…)的网站被删除了吗?我看到那里有404…
  • null不是一个对象。typeof null == 'object';返回true是因为一个bug无法在javascript中修复(目前,但将来可能会改变)。


问题的第一部分:

Why is null considered an object in JavaScript?

这是一个他们现在无法修复的javascript设计错误。它应该是空类型,而不是对象类型,或者根本没有对象类型。当检测到真正的对象时,它需要额外的检查(有时会被忘记),并且是错误的来源。

问题的第二部分:

Is checking

if (object == null)
Do something

the same as

if (!object)
Do something

这两项检查都是错误的,除了:

  • 对象未定义或为空:均为真。

  • 对象是原始对象,0,""或false:第一个检查为false,第二个检查为true。

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

因此,如果"object"被解释为一个真实的对象,那么两个检查总是相同的。如果允许使用原语,则对0、""和false的检查是不同的。

在像object==null这样的情况下,不明显的结果可能是bug的来源。不建议使用==,而是使用===

问题的第三部分:

And also:

What is the difference between null and undefined?

在JavaScript中,一个区别是空值属于对象类型,而未定义值属于未定义类型。

在javascript中,null==undefined为真,如果忽略类型,则视为相等。为什么他们认为,但是0,""和false不相等,我不知道。这似乎是一种武断的意见。

在javascript中,null===undefined不是真的,因为===中的类型必须相同。

实际上,空和未定义是相同的,因为它们都表示不存在。因此,0和""也一样,可能是空容器[]{}。很多相同的类型,没有什么是bug的配方。一种或一种都不好。我尽量少用。

'false'、'true'和'!'是另一个可以简化的蠕虫包,例如,仅if(!x)if(x)就足够了,您不需要判断真假。

如果没有给定值,则声明的var x是未定义的类型,但它应该与从未声明X的类型相同。另一个bug源是一个空的无内容容器。所以最好一起声明和定义它,就像var x=1一样。

人们一圈又一圈地转来转去,试图弄清楚所有这些不同类型的东西,但是在复杂的不同的衣服里,它们都是一样的。现实是

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

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

  • +在结尾的那句话是1。
  • +1.回答所有问题
  • 回答得很好,但这与[]有点过分:"实际上,空的和未定义的是相同的……可能是空容器和,"你可能会说服我认为应该是某种形式的空值,但我的直觉是它不应该是空值。但争议较小的是,空数组[]可以理解地具有.push()函数,所以没有很好的理由认为是空值。0.02美元。


1
var x = null;

x定义为空

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

1
if (!x)

空值的计算结果为假


在javascript中比较许多不同的空检查:

http://jsfidle.net/aaronhoffman/ddrhb/5/

1
2
3
4
5
6
7
8
9
10
11
12
13
// 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://aron-hoffman.blogspot.com/2013/04/javascript-null-checking-undefined-and.html

JavaScript Null Check Comparison Chart

  • "var myundefined;"是否定义变量(作为未知类型的已知变量)?
  • @齐凡是的,没错。


理解空值和未定义值的一种方法是理解每个值出现在哪里。

在以下情况下应为空返回值:

  • 查询DOM的方法

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

1
2
3
4
    {
      name:"Bob",
      address: null
    }
  • ReExx.Exc.

  • 处于流动状态的新功能。以下返回空值:

1
2
3
4
5
        var proto = Object.getPrototypeOf(Object.getPrototypeOf({}));

       // But this returns undefined:

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

所有其他不存在的情况都用未定义表示(如@axel所述)。以下每种打印都是"未定义"的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    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避免引用错误:

1
2
3
if(typeof unknown !=="undefined"){
    //use unknown
}

总之,在操作DOM、处理Ajax或使用某些EcmaScript 5功能时,请检查是否为空。对于所有其他情况,可以安全地检查未定义,并严格相等:

1
2
3
if(value === undefined){
  // stuff
}

对于值相等(空=未定义),空和未定义都是假的:它们都折叠为布尔值假。它们不是同一对象(空!=未定义的。

Undefined是全局对象的属性("window"在浏览器中),但它是原始类型,而不是对象本身。它是未初始化变量和函数的默认值,结尾没有返回语句。

空是对象的实例。空用于返回集合对象以指示空结果的DOM方法,该方法提供一个不指示错误的错误值。


在回答undefinednull与本页的javascript最终指南之间的差异时,还需要补充以下内容:

You might consider undefined to represent system-level, unexpected,
or error-like absense of value and null to represent program-level,
normal, or expected absence of value. If you need to assign one of
these values to a variable or property or pass one of these values to
a function, null is almost always the right choice.


一些精度:

空值和未定义值是两个不同的值。一个表示名称没有值,另一个表示名称没有值。

if中发生的情况对if( o )来说如下:

计算圆括号o中的表达式,然后if启动类型强制圆括号中表达式的值-在我们的情况下是o

javascript中的falsy(将强制为false)值为:""、null、undefined、0和false。


以下功能说明了原因,并能够计算出差异:

1
2
3
4
5
6
function test() {
        var myObj = {};
        console.log(myObj.myProperty);
        myObj.myProperty = null;
        console.log(myObj.myProperty);
}

如果你打电话

1
test();

你得到

undefined

null

第一个console.log(...)试图从myObj中得到myProperty,但它还没有定义,所以它返回"未定义"。给它赋空后,第二个console.log(...)返回明显的"空",因为myProperty存在,但它的值为null赋给它。

为了能够查询这种差异,javascript有nullundefined:虽然null和其他语言中的对象一样,但undefined不能是对象,因为没有可用的实例(甚至没有null实例)。


看看这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
function f(a){
  alert(typeof(a));
  if (a==null) alert('null');
  a?alert(true):alert(false);
}

                                          //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

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

  • 错误-nullundefined都是原始值-typeof null === 'object'是语言错误,因为Object(null) !== null
  • 不,不是。object()以这种方式转换工作,请参见ecma international.org/publications/files/ecma-st/ecma-262.p&zwnj;&8203;df--15.2.2.1新对象([值])…8。(未提供参数值或其类型为空或未定义。)创建一个新的本机ECMAScript对象。新构造对象的[[原型]]属性设置为对象原型对象。新构造对象的[[类]]属性设置为"对象"。新构造的对象没有[[值]]属性。返回新创建的本机对象。
  • @克里斯托夫:我是说,你说得对。空值应该是一个类型,我的意思是您不能这样检查它,因为:alert(new object()!==new object());/*true,new istance与spec/alert(object(null).constructor==.constructor);/true不同于spec/alert(object(null).prototype==.prototype);/true,与spec/alert(object的null instanceof object);/显然false,null表示未实例化*/但基本上是spec bug xd请参见:uselespickles.com/blog/2006/06/12/&hellip;和javascript.crockford.com/remedical.html
  • 为什么他们不把一切都变成一个物体…


与未定义相比,空的另一个有趣之处是它可以递增。

1
2
3
4
5
6
x = undefined
x++
y = null
y++
console.log(x) // NaN
console.log(y) // 0

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


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

"window.someWeirdProperty === null"评估为假,而

"window.someWeirdProperty === undefined"的计算结果为真。

另外,检查if (!o)是否与if (o == null)检查o是否为false不同。

  • 你能解释一下这两种情况的区别吗
  • 阅读我的答案,他意味着如果o等于0,则为假或"布尔值为假:var undef,variable=[0,",null,false,undef];for(var obj in variable)alert(!obj);//在ie中为4倍假,在ff中为5倍;)


在javascript中,null不是object类型,而是primitave类型。

有什么区别?未定义是指尚未设置的指针。空是指空指针,例如,某个变量手动设置为null类型。


从Nicholas C.Zakas的"面向对象的javascript原则"中

But why an object when the type is null? (In fact, this has been acknowledged as an error by TC39, the committee that designs and maintains JavaScript. You could reason that null is an empty object pointer, making"object" a logical return value, but that’s still confusing.)

Zakas,Nicholas C.(2014-02-07)。面向对象的JavaScript的原理(Kindle位置226-227)。没有淀粉压榨机。Kindle版本。

上面说:

1
2
3
4
5
6
7
8
9
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;

未定义病例:

1
2
3
4
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"。因此,我建议,当你需要去掉变量的值时,不要"删除"…将其设置为"空"。旧值将被孤立,很快将被垃圾收集;新值为"没有值(现在)。"在这两种情况下,变量的状态都是确定的:"显然,故意这样做了。"


  • 未定义表示变量已声明,但尚未分配任何值,而可以将空值分配给表示"无值"的变量。(空值是赋值运算符)
  • 2.Undefined是类型本身,而null是对象。

    3.javascript本身可以将任何未分配的变量初始化为未定义,但不能将变量的值设置为空。这必须通过编程来完成。