在JavaScript undefined
中可以重新分配,因此通常建议创建一个自执行函数,以确保undefined实际上是未定义的。另外,null
和undefined
绝对是==
,但是其他任何值都与null/undefined
大致相等?
基本上你可以安全地替换它:
(function(undefined){
window.f = function(obj){
if(obj===undefined || obj===null ){
alert('value is undefined or null');
}
}
})();
使用:
window.f = function(obj){
if(obj==null){
alert('value is undefined or null');
}
}
如果上述内容100%安全,为什么JavaScript社区/图书馆不会完全删除undefined
并使用较短的x == null
条件来检查null
/ {{1马上?
修改
我从未见过某人真正代表“未定义”vs undefined
的“未知价值”?我从未见过这种情况,这也是我最初提出这个问题的原因。它似乎是两个令人难以置信的混淆值,从未在其原始意图中使用。标准化所有内容以进行比较null
将有利于规模并避免重新分配的任何问题。一切都会继续发挥作用
obj==null
此规则的一个例外似乎是将var obj={};
obj.nonExistantProperty==null // true
var x;
ix==null // true
function(obj){
obj==null // true
}
/ undefined
转换为整数。这是一个非常适合年龄的情况,但绝对应该注意。
null
而
+(null)==0
考虑到NaN是JavaScript中唯一不等于它的值,你可以做一些非常疯狂的事情,如:
isNaN(+undefined)
如果您不打算将值转换为整数,则使用+undefined == +undefined // false
+null == +null // true
作为松散等式null
代替==
是安全的。这是一个非常优秀的案例。
答案 0 :(得分:6)
语言规范第11.9.3节中的abstract equality algorithm定义为==
和!=
,并定义它们
null == void 0
null == null
void 0 == null
其中void 0
只是说undefined
的可靠方式(见下文),所以问题的答案是肯定的,null
等于未定义而且本身并没有别的。
规范的相关部分是
1. If Type(x) is the same as Type(y), then If Type(x) is Undefined, return true. If Type(x) is Null, return true. ... 2. If x is null and y is undefined, return true. 3. If x is undefined and y is null, return true. ...
如果您担心undefined
含义不同于通常的含义,请改用void 0
。
null == void 0 // True
({}).x === void 0 // True
"undefined" === typeof void 0 // True
(function () {})() === void 0 // True
(undefined = 42,
undefined === void 0) // False
"undefined" === typeof undefined // False
"undefined" === typeof void 0 // True
11.4.2无效运算符
制作UnaryExpression: void UnaryExpression 评估如下:
- 让
的结果expr
成为评估 UnaryExpression /。- 致电
GetValue(expr)
。- 返回未定义。
醇>
因此void
前缀运算符会计算其参数并返回特殊值 undefined ,而不管全局变量undefined
已被更改(或undefined
定义:)。
编辑:回应评论,
如果您正在处理区分两者的库代码,那么您需要处理差异。一些由语言委员会标准化的新图书馆确实忽略了这些差异:JSON.stringify([void 0]) === "[null]"
但是有太多的代码可以巧妙地区别对待它们,还有其他差异:
+(null) === 0
isNaN(+undefined)
"" + null === "null"
"" + undefined === "undefined"
如果您正在编写任何类型的库来生成文本或序列化/反序列化,并且您希望将两者混淆,那么您无法通过undefined
并期望它表现为null
- - 您需要明确地将输入标准化为一个或另一个。
答案 1 :(得分:4)
因为JavaScript同时具有这两个值。虽然其他语言可能只有nil
/ null
JavaScript长大,undefined
是“未知值”,而null
显然已知价值代表什么。
比较var x
,其中x
未定义,因为未分配任何值,var y = null
y
为null
。它被设定为某种东西 - 一种代表“没有”的句子。 JavaScript中undefined
vs null
的核心基本用法非常深入,其他情况包括:
delete
'd)属性也会产生undefined
而不是null
(仅当null
被分配时才会产生null
)。undefined
。undefined
从getElementById
因此,在Javascript 中,使用undefined
而不是null
通常更为正确。它们都代表不同的东西。试图解决这个问题的图书馆正在打击JavaScript。
快乐的编码。
就个人而言,在几乎所有情况下,我都避免对undefined
或null
进行明确检查。我认为,在大多数情况下 - 但不是全部 - 情况下,所有错误的价值都应该是等价的,并且呼叫者有责任遵守所述的公共合同。
由于这种信念,我会认为比较x == null
即将试图过多而且过少,但在捕捉null
或的情况下undefined
,正如所指出的那样有效。开始一个趋势; - )
答案 2 :(得分:2)
因此:
var myVar1;
var myVar2 = null;
if (myVar1 === null) alert('myVar1 is null');
if (myVar1 === undefined) alert('myVar1 is undefined');
if (myVar2 === null) alert('myVar2 is null');
if (myVar2 === undefined) alert('myVar2 is undefined');
任何设置为null的内容都不是未定义的 - 它被定义为null。
答案 3 :(得分:0)
阅读 Javascript:好的部分,似乎只有null和undefined是等价的
JavaScript有两组相等运算符:===和!==,它们的邪恶双胞胎==和!=。好的 以你期望的方式工作。如果两个操作数的类型相同且值相同,则=== 生成true并且!==生成false。当操作系统出现时,邪恶的双胞胎做正确的事 相同类型,但如果它们属于不同类型,则会尝试强制使用这些值。他们这样做的规则 是复杂和不可取的。这些是一些有趣的案例:
'' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n ' == 0 // true
“JavaScript:Douglas Crockford撰写的好文章。版权所有2008 Yahoo! Inc., 978-0-596-51774-8“。