JavaScript未定义替换为null
在JavaScript中,可以重新分配未定义的,因此通常建议创建一个自动执行函数,以确保未定义实际上是未定义的。另一种选择是JavaScript未定义替换为null,javascript,null,undefined,Javascript,Null,Undefined,在JavaScript中,可以重新分配未定义的,因此通常建议创建一个自动执行函数,以确保未定义实际上是未定义的。另一种选择是null和undefined肯定是=,但其他值是否与null/undefined大致相同 太长,读不下去了 基本上,您可以安全地更换此: (function(undefined){ window.f = function(obj){ if(obj===undefined || obj===null ){ alert('value is und
null
和undefined
肯定是=
,但其他值是否与null/undefined
大致相同
太长,读不下去了
基本上,您可以安全地更换此:
(function(undefined){
window.f = function(obj){
if(obj===undefined || obj===null ){
alert('value is undefined or null');
}
}
})();
与:
如果以上内容是100%安全的,为什么JavaScript社区/库不一起删除undefined
,并使用较短的x==null
条件同时检查null
/undefined
编辑:
我从未见过有人用'undefined'vsnull
实际表示“未知值”?我从未见过这种情况,这也是我最初提出这个问题的原因。这似乎是两个令人难以置信的混淆值,它们从未在其原始意图中使用过。将所有内容标准化以进行比较obj==null
将有助于增加大小并避免任何重新分配的问题。一切都会继续运作
var obj={};
obj.nonExistantProperty==null // true
var x;
ix==null // true
function(obj){
obj==null // true
}
此规则的一个例外是将undefined
/null
强制转换为整数。这是一个相当古老的场景,但绝对应该注意
+(null)==0
虽然
isNaN(+未定义)
考虑到NaN是JavaScript中唯一不等于自身的值,您可以做一些非常疯狂的事情,如:
+undefined == +undefined // false
+null == +null // true
使用null
作为松散的等式=
替换未定义的
是安全的,前提是您不打算将值强制转换为整数。这是一个非常边缘的情况。因为:
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。阅读Javascript:好的部分,似乎只有null和未定义是等效的
JavaScript有两组相等运算符:==和!==,还有他们邪恶的双胞胎。好的
按照你期望的方式工作。如果两个操作数类型相同且值相同,则===
生成真实的和!==产生错误。当操作数为
相同的类型,但如果它们属于不同的类型,则会尝试强制这些值。他们这样做的规则
这些都是复杂而难以描述的。以下是一些有趣的案例:
'' == '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。,
因为JavaScript有两个值。虽然其他语言可能只有
nil
/null
JavaScript是在undefined
为“未知值”的情况下成长起来的,而null
显然是一个不代表任何内容的已知值
比较var x
其中x
未定义,因为未分配任何值,var y=null
其中y
为null
。它被设置成一个句子,表示“什么都没有”。JavaScript中undefined
vsnull
的核心基本用法非常深入,其他情况包括:
delete
'd)属性也会产生未定义的和非null
(仅当已分配null
时,才会导致null
)
未定义的
未定义
从标准函数(如getElementById
返回)。见评论undefined
和notnull
通常更为正确,它们都表示不同的内容。试图与之抗争的库就是与JavaScript抗争
快乐编码
就个人而言,在几乎所有情况下,我都避免显式检查
未定义
或空
。我相信,在大多数情况下——但不是所有情况下——所有虚假的价值都应该是相等的,并且呼叫者有责任遵守所述的公共合同
因为这样的信念,我会考虑比较代码< x==null <代码>,在试图保护太多而太少的时候,但是在捕获<代码> null 或<代码>未定义< /代码>的情况下,它是有效的,正如指出的那样。开始一种趋势;-)
语言规范第11.9.3节中的定义是==
和=代码>并定义它们,以便
null == void 0
null == null
void 0 == null
其中,void 0
只是表示undefined
(见下文)的一种可靠方式,因此您的问题的答案是肯定的,null
等于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:voidUnaryExpression的计算如下:
让expr
作为计算UnaryExpression/的结果
调用GetValue(expr)
返回未定义的
因此,void
前缀运算符计算其参数并返回特殊值undefined,而不管全局变量undefined
更改了什么(或者是否定义了undefined
)
编辑:回应评论
如果您处理的库代码区别于两者,那么您需要处理差异。语言委员会标准化的一些新库确实忽略了这一差异:JSON.stringify([void 0])===“[null]”
,但有太多代码对它们进行了微妙的区别,还有其他差异:
+(null) === 0
isNaN(+undefined)
"" + null === "null"
"" + undefined === "undefined"
如果您正在编写生成文本或序列化的任何类型的库
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
+(null) === 0
isNaN(+undefined)
"" + null === "null"
"" + undefined === "undefined"