为什么在JavaScript中将null
视为object
?
正在检查
if ( object == null )
Do something
与...相同
if ( !object )
Do something
?
并且:
null
和undefined
什么区别?
#1楼
理解null和undefined的一种方法是了解每种情况的发生位置。
在以下情况下,期望返回空值:
查询DOM的方法
console.log(window.document.getElementById("nonExistentElement")); //Prints: null
从Ajax请求收到的JSON响应
{
name: "Bob",
address: null
}
不断变化的新功能。 以下返回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
}
#2楼
要补充此页面上的 JavaScript权威指南中的undefined
和null
之间的区别是什么 :
您可能认为
undefined
表示系统级,意外或类似错误的值null
,而null
表示程序级,正常或预期的值缺失。 如果您需要将这些值之一分配给变量或属性或将这些值之一传递给函数,则null
几乎总是正确的选择。
#3楼
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
#4楼
以下功能说明了原因并能够解决差异:
function test() {
var myObj = {};
console.log(myObj.myProperty);
myObj.myProperty = null;
console.log(myObj.myProperty);
}
如果你打电话
test();
你正在
未定义
空值
第一个console.log(...)
试图在尚未定义的myObj
获取myProperty
因此它返回“未定义”。 在为它分配了null之后,第二个console.log(...)
显然会返回“ null”,因为myProperty
存在,但已为其分配了null
值。
为了能够查询这种差异,JavaScript具有null
和undefined
:尽管null
是-就像在其他语言中一样,object, undefined
不能是对象,因为没有可用的实例(甚至不是null
实例)。
#5楼
摘自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.
#6楼
考虑“空”的最好方法是回忆一下在数据库中如何使用类似的概念,它表示一个字段“根本没有任何值”。
- 是的,该物品的价值是已知的; 它是 “定义的”。 它已被初始化。
- 该项目的值是: “没有值”。
这对于编写更易于调试的程序是非常有用的技术。 “未定义”变量可能是错误的结果…… (您怎么知道?) ……但是,如果变量包含值“ null”,则您会知道“有人在该程序的某个位置, 将其设置为因此,我建议当您需要删除变量的值时,请不要“删除”,而是将其设置为“空”。 旧值将被孤立,不久将被垃圾回收; 新值是“没有值(现在)”。 在这两种情况下,变量的状态都是确定的:“显然,它是故意这样做的。”
#7楼
与未定义相比,null的另一个有趣之处在于它可以递增。
x = undefined x++ y = null y++ console.log(x) // NaN console.log(y) // 0
这对于设置计数器的默认数值很有用。 您在变量声明中将变量设置为-1多少次?
#8楼
- 未定义表示已声明变量,但尚未分配任何值,而可以将Null分配给表示“无值”的变量。(Null是赋值运算符)
2. Undefined是类型本身,而Null是对象。
3 Javascript本身可以将任何未分配的变量初始化为undefined,但是永远不能将变量的值设置为null。 这必须以编程方式完成。
#9楼
在Javascript中, null
不是object
类型,它是primitave
类型。
有什么区别? 未定义是指尚未设置的指针。 Null表示空指针,例如,某些东西已手动将变量设置为null
类型
#10楼
看这个:
<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
#11楼
问题的第一部分:
为什么在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)
,则两个检查都为false。
因此,如果“对象”被解释为表示真实对象,则两个检查始终相同。 如果允许使用原语,则对于0, ""
和false的检查是不同的。
在object==null
类的情况下,不明显的结果可能是错误的来源。 绝不建议使用==
,而应使用===
。
问题的第三部分:
并且:
null和undefined有什么区别?
在JavaScript中,一个区别是null为object类型,而undefined为undefined类型。
在JavaScript中, null==undefined
为true,如果类型被忽略,则视为相等。 为什么他们决定,但0, ""
和false不相等,我不知道。 这似乎是一个任意看法。
在JavaScript中, null===undefined
不是true,因为类型必须在===
相同。
实际上,null和undefined是相同的,因为它们都表示不存在。 因此,0和""
也是如此,也许还有空容器[]
和{}
。 如此多的相同类型的东西都是导致错误的良方。 一种或根本没有更好。 我会尝试使用尽可能少的。
'false','true'和'!' 是另一种可以简化的蠕虫,例如,仅if(!x)
和if(x)
就足够了,您不需要true和false。
如果没有给出值,则声明的var x
的类型为undefined,但是它应该与从未声明过x的变量相同。 另一个错误源是一个空的无容器。 因此,最好像var x=1
一样一起声明和定义它。
人们四处走动,试图找出所有这些类型的虚无,但都是一件复杂而又不同的衣服。 现实是
undefined===undeclared===null===0===""===[]==={}===nothing
也许所有人都应该抛出异常。
#12楼
null
不是对象 ,它是原始值 。 例如,您不能向其添加属性。 有时人们会错误地认为它是一个对象,因为typeof null
返回"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
是一种边缘情况,因为它适用于null
和undefined
:
> 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
,因此您必须小心(例如,上述检查不能区分undefined
和0
)。
-
undefined
,null
- 布尔值:
false
- 数字:
+0
,-0
,NaN
- 字符串:
""
您可以通过使用Boolean
作为函数来测试到boolean的转换(通常是构造函数,与new
一起使用):
> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true
#13楼
null
是一个对象。 其类型为null。 undefined
不是对象; 其类型未定义。
#14楼
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陷阱
#15楼
例如, window.someWeirdProperty
是未定义的,因此
"window.someWeirdProperty === null"
计算结果为false
"window.someWeirdProperty === undefined"
计算结果为true。
此外checkif if (!o)
是不一样的检查if (o == null)
为o
是false
。
#16楼
var x = null;
x定义为null
y未定义; //因为我没有定义它
if (!x)
null被评估为false
#17楼
对于值相等,null和undefined均为false(null == undefined):它们都折叠为布尔值false。 它们不是同一对象(null!== undefined)。
undefined是全局对象的属性(浏览器中为“窗口”),但它是原始类型,而不是对象本身。 这是未初始化的变量和函数的默认值,这些变量和函数以没有return语句的形式结束。
null是Object的实例。 对于用于返回集合对象以指示为空结果的DOM方法,将使用null,该方法将提供false值而不指示错误。
#18楼
区别可以总结为以下代码段:
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
#19楼
(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必须是唯一的,但名称不必是唯一的。
#20楼
一些精度:
null和undefined 是两个不同的值。 一个代表缺少名称的值,而另一个代表缺少名称。
if
对if( o )
进行以下操作, if( o )
会发生什么:
评估括号o中的表达式,然后执行if
强制将括号中表达式的值强制类型化(在我们的情况下为o
。
JavaScript中的Falsy(将被强制转换为false)的值为: ”,null,undefined,0和false 。