为什么null是一个对象,null和undefined有什么区别?
为什么null
在JavaScript中被认为是一个object
?
正在检查
if ( object == null ) Do something
一样
if ( !object ) Do something
?
并且:
null
和undefined
什么区别?
(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中修复)。
null
和undefined
的区别如下:
-
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
是一个边缘情况,因为它适用于null
和undefined
:
> 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
,所以你必须小心(例如,上面的检查不能区分undefined
和0
)。
-
undefined
,null
- 布尔人:
false
- 数字:
+0
,-0
,NaN
- 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 x
types是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
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 。
要添加到undefined
和null
之间的差异的答案,请参见 本页上的 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有null
和undefined
:虽然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的状态都是肯定的:“显然,故意这样做。”
- Undefined表示一个variables已经被声明,但是它没有被赋值,而Null可以赋值给一个表示“无值”的variables(Null是一个赋值操作符)
2.Undefined是一个types本身,而Null是一个对象。
3.Javascript本身可以初始化任何未定义的variables,但是不能将variables的值设置为null。 这必须以编程方式完成。
在Javascript中 null
不是一个object
types,它是一个primitave
types。
有什么不同? 未定义是指尚未设置的指针。 空指的是空指针,例如某些东西已经手动设置了一个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