JavaScript未定义替换为null

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

在JavaScript中,可以重新分配未定义的,因此通常建议创建一个自动执行函数,以确保未定义实际上是未定义的。另一种选择是
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'vs
null
实际表示“未知值”?我从未见过这种情况,这也是我最初提出这个问题的原因。这似乎是两个令人难以置信的混淆值,它们从未在其原始意图中使用过。将所有内容标准化以进行比较
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
vs
null
的核心基本用法非常深入,其他情况包括:

  • 缺少(或
    delete
    'd)属性也会产生
    未定义的
    和非
    null
    (仅当已分配
    null
    时,才会导致
    null
  • 未分配的函数参数是
    未定义的
  • 未定义
    从标准函数(如
    getElementById
    返回)。见评论
  • 因此,在Javascript中,使用
    undefined
    和not
    null
    通常更为正确,它们都表示不同的内容。试图与之抗争的库就是与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"