为什么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是没有事物的概念存在; 它没有types,在这个范围之前从来没有被引用。 null是事物已知存在的地方,但是不知道它的价值是什么。

有一件事要记住的是,在概念上, null不是在false""之后,即使它们在types转换后等同

 name = false; 

你:什么是name
JavaScript:布尔值false。

 name = ''; 

你:什么是name
JavaScript:空string


*:在这个上下文中的name意味着一个从未被定义的variables。 这可能是任何未定义的variables。 但是,名称是任何HTML表单元素的属性。 它回到原点,并在id之前build立。 这很有用,因为ID必须是唯一的,但名称不一定是。

差异可以概括为这个片段:

 alert(typeof(null)); // object alert(typeof(undefined)); // undefined alert(null !== undefined) //true alert(null == undefined) //true 

检查

object == null与检查if ( !object )

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

由于Boolean(null)等于false,所以!false === true

所以如果你的对象不是null而是 false或者0或者是“” ,这个检查就会通过,因为:

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

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

nullundefined的区别如下:

  • undefined :由JavaScript使用,意思是“没有价值”。 未初始化的variables,缺less的参数和未知的variables都具有该值。

     > var noValueYet; > console.log(noValueYet); undefined > function foo(x) { console.log(x) } > foo() undefined > var obj = {}; > console.log(obj.unknownProperty) undefined 

    访问未知variables会产生一个exception:

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

检查variables:

 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 

检查variables是否有值的常用方法是将其转换为布尔值,并查看它是否为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
  • string: ""

你可以通过使用Boolean作为函数来testing转换为布尔值(通常它是一个构造函数,用于new ):

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

null和undefined有什么区别?

没有定义的属性是未定义的。 null是一个对象。 它的types是对象。 null是一个特殊的值,意思是“没有值。undefined不是一个对象,它的types是未定义的。

您可以声明一个variables,将其设置为null,除非您将“null”打印出来而不是“undefined”,否则行为是相同的。 你甚至可以比较一个未定义的variables为null,反之亦然,条件成立:

  undefined == null null == undefined 

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

并与您的新编辑 是的

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

当testing对象是否为false时,它们都只在testing时才符合条件,否则为false

检查这里: Javascript gotcha

问题的第一部分:

为什么null在JavaScript中被认为是一个对象?

这是他们现在无法修复的JavaScriptdevise错误。 它应该是空的types,而不是types的对象,或根本没有它。 在检测真实物体时,需要额外检查(有时被遗忘),并且是错误的来源。

问题的第二部分:

正在检查

if (object == null)
Do something

一样

if (!object)
Do something

除了以下两项检查外,这两项检查总是假的:

  • 对象是未定义的或空的:都是真的。

  • 对象是原始的,而0, ""或者是false:首先检查false,其次是true。

如果对象不是原语,而是一个真实的对象,如new Number(0)new String("")new Boolean(false) ,则两个检查都是false。

所以如果“对象”被解释为一个真实的对象,那么两个检查总是相同的。 如果允许原语,那么检查对于0, ""和“假""是不同的。

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

问题的第三部分:

并且:

null和undefined有什么区别?

在JavaScript中,一个区别是null是types对象,undefined是undefinedtypes。

在JavaScript中, null==undefined是true,如果忽略type,则认为是相等的。 为什么他们决定,但是0, ""和假不相等,我不知道。 这似乎是一个任意的意见。

在JavaScript中, null===undefined不是真的,因为types必须在===相同。

实际上,null和undefined是相同的,因为它们都表示不存在。 所以0和""也是这样,也许是空容器[]{} 。 同样的许多types都不是臭虫的秘诀。 一种或根本没有一种更好。 我会尽量less用。

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

如果没有给定值,声明的var xtypes是undefined,但是它应该和x从未声明过的一样。 另一个bug源是一个空的容器。 所以最好一起声明和定义它,比如var x=1

人们围着圈子试图弄清楚所有这些不同types的东西,但在复杂的不同的衣服中,这些都是一样的。 现实是

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

也许所有人都应该抛出exception。

 var x = null; 

x被定义为null

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

 if (!x) 

null被评估为false

理解null和undefined的一种方法是了解每个事件发生的位置。

在以下情况下,需要返回空值:

  • 查询DOM的方法

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

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

  • 新function处于不断变化的状态。 以下内容返回null:

 var proto = Object.getPrototypeOf(Object.getPrototypeOf({})); // But this returns undefined: Object.getOwnPropertyDescriptor({}, "a"); 

所有其他不存在的情况都表示为未定义(如@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 unitialised = null; 或者自己从方法中返回null,那么你在其他情况下发生null。 但是这应该是非常明显的。

第三种情况是当你想访问一个variables,但你甚至不知道它是否被声明。 对于这种情况,使用typeof来避免引用错误:

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

在操作DOM,处理Ajax或使用某些ECMAScript 5function时,总结检查null。 对于所有其他情况,使用严格的等式检查未定义是安全的:

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

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空检查比较图表

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

undefined是全局对象(浏览器中的“窗口”)的一个属性,但它是一个基本types,而不是一个对象本身。 这是未初始化的variables和没有返回语句的函数的默认值。

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

null是一个对象。 它的types是null。 undefined不是一个对象; 它的types是未定义的。

一些精确度:

null和undefined 两个不同的值。 一个是代表一个名字没有价值,另一个代表没有名字。


if( o )

对括号o中的expression式进行评估,然后if踢出types – 在括号中强制expression式的值 – 在我们的情况o

Falsy(这将被强制为false)的值是: '',null,undefined,0和false

要添加到undefinednull之间的差异的答案,请参见 本页上的 JavaScript权威指南:

您可能会考虑undefined来表示系统级别,意外或错误状态的null值, null表示程序级别,正常或预期不存在值。 如果您需要将这些值中的一个赋值给variables或属性,或者将这些值中的一个赋值给函数,那么null几乎总是正确的select。

下面的函数显示了为什么能够找出差异:

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

如果你打电话

 test(); 

你越来越

未定义

空值

第一个console.log(...)尝试从myObj获取myProperty ,而它尚未定义 – 所以它返回“undefined”。 第二个console.log(...)在给它赋值为null之后,明显地返回“null”,因为myProperty存在,但是赋值为null

为了能够查询这个区别,JavaScript有nullundefined :虽然null是 – 就像在其他语言中一样, undefined不能是一个对象,因为没有可用的实例(即使不是null实例)。

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

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

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

此外, if (!o)与检查if (o == null)false if (o == null) checkif。

与未定义相比,关于null的其他有趣的事情是它可以递增。

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

来自Nicholas C. Zakas的“面向对象的Javascript原则”

但为什么一个对象时,types为null? (事实上​​,这个被devise和维护JavaScript的委员会TC39公认是一个错误,你可能会认为null是一个空的对象指针,使得“object”成为一个逻辑返回值,但这仍然令人困惑。

Zakas,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. 

思考“空”的最好方法是回想一下在数据库中如何使用类似的概念,它表明一个字段包含“根本没有价值”。

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

这是编写更容易debugging的程序非常有用的技术。 一个'未定义的'variables可能是一个错误的结果… (你怎么知道的?) …但是如果variables包含值'null',你就知道“某个人在这个程序的某个地方把它设置为'null'。“因此,我build议,当你需要摆脱一个variables的值,不要”删除“…将其设置为”空“。 旧的价值将成为孤儿,很快将被垃圾收集; 新的价值是“没有价值(现在)”。 在这两种情况下,variables的状态都是肯定的:“显然,故意这样做。”

  1. Undefined表示一个variables已经被声明,但是它没有被赋值,而Null可以赋值给一个表示“无值”的variables(Null是一个赋值操作符)

2.Undefined是一个types本身,而Null是一个对象。

3.Javascript本身可以初始化任何未定义的variables,但是不能将variables的值设置为null。 这必须以编程方式完成。

Javascript中 null不是一个objecttypes,它是一个primitavetypes。

有什么不同? 未定义是指尚未设置的指针。 指的是空指针,例如某些东西已经手动设置了一个variablestypes为null

看这个:

  <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