Why is null an object and what's the difference between null and undefined?
为什么在javascript中
正在检查
1 2 | if ( object == null ) Do something |
一样
1 2 | if ( !object ) Do something |
?
还有:
1 | (name is undefined) |
你:什么是
1 | name = null; |
你:什么是
简而言之,
要记住的一件事是,从概念上讲,
1 | name = false; |
你:什么是
1 | name = ''; |
你:什么是
*:
差异可以概括为以下几点:
1 2 3 4 5 | alert(typeof(null)); // object alert(typeof(undefined)); // undefined alert(null !== undefined) //true alert(null == undefined) //true |
检查
后者等于
因为
因此,如果您的对象不是空的,而是假的或0或",则检查将通过因为:
1 2 3 | alert(Boolean(null)) //false alert(Boolean(0)) //false alert(Boolean("")) //false |
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 definednull :程序员用来表示"无值",例如作为函数的参数。
检查变量:
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==来执行可能产生意外结果的各种转换。支票
1 2 3 4 | > null == null true > undefined == null true |
检查变量是否有值的一种常见方法是将其转换为布尔值,并查看它是否为
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"; } |
这种方法的缺点是:以下所有值都对
- 江户十一〔23〕、江户十一〔19〕。
- 布尔值:
false 。 - 编号:
+0 、-0 、NaN 。 - 字符串:
"" 。
您可以使用
1 2 3 4 5 6 7 8 9 10 | > Boolean(null) false > Boolean("") false > Boolean(3-3) false > Boolean({}) true > Boolean([]) true |
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
问题的第一部分:
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。
如果对象不是原始对象,而是真实对象,如
因此,如果"object"被解释为一个真实的对象,那么两个检查总是相同的。如果允许使用原语,则对0、
在像
问题的第三部分:
And also:
What is the difference between null and undefined?
在JavaScript中,一个区别是空值属于对象类型,而未定义值属于未定义类型。
在javascript中,
在javascript中,
实际上,空和未定义是相同的,因为它们都表示不存在。因此,0和
'false'、'true'和'!'是另一个可以简化的蠕虫包,例如,仅
如果没有给定值,则声明的
人们一圈又一圈地转来转去,试图弄清楚所有这些不同类型的东西,但是在复杂的不同的衣服里,它们都是一样的。现实是
1 | undefined===undeclared===null===0===""===[]==={}===nothing |
也许所有人都应该抛出异常。
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
理解空值和未定义值的一种方法是理解每个值出现在哪里。
在以下情况下应为空返回值:
查询DOM的方法
1
2console.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方法,该方法提供一个不指示错误的错误值。
在回答
You might consider
undefined to represent system-level, unexpected,
or error-like absense of value andnull 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.
一些精度:
空值和未定义值是两个不同的值。一个表示名称没有值,另一个表示名称没有值。
计算圆括号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
第一个
为了能够查询这种差异,javascript有
看看这个:
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 |
与未定义相比,空的另一个有趣之处是它可以递增。
1 2 3 4 5 6 | x = undefined x++ y = null y++ console.log(x) // NaN console.log(y) // 0 |
这对于设置计数器的默认数值很有用。在声明中将变量设置为-1的次数有多少次?
例如,
另外,检查
在javascript中,
有什么区别?未定义是指尚未设置的指针。空是指空指针,例如,某个变量手动设置为
从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本身可以将任何未分配的变量初始化为未定义,但不能将变量的值设置为空。这必须通过编程来完成。