JavaScript undefined替换为null

Lim*_*ime 9 javascript null undefined

在JavaScript undefined中可以重新分配,因此通常建议创建一个自执行函数,以确保undefined实际上是未定义的.作为一种替代方案null,undefined肯定==是其他任何价值相当于null/undefined?

TLDR

基本上你可以安全地替换这个:

(function(undefined){

   window.f = function(obj){
     if(obj===undefined || obj===null ){
       alert('value is undefined or null');
     }
   }

})();
Run Code Online (Sandbox Code Playgroud)

有:

window.f = function(obj){
  if(obj==null){
    alert('value is undefined or null');
  }
}
Run Code Online (Sandbox Code Playgroud)

如果以上是100%安全的话,为什么JavaScript社区/库undefined完全没有丢弃并使用较短的x == null条件来同时检查两个null/ undefined?

编辑:

我从来没有见过某人真正代表"未定义"vs的"未知价值" null?我从未见过这种情况,这也是我最初提出这个问题的原因.它似乎是两个令人难以置信的混淆值,从未在其原始意图中使用.标准化所有内容以进行比较obj==null将有利于大小并避免重新分配的任何问题.一切都会继续发挥作用

var obj={};
obj.nonExistantProperty==null // true

var x;
ix==null // true

function(obj){
  obj==null // true
}
Run Code Online (Sandbox Code Playgroud)

此规则的一个例外似乎是在转换undefined/ null到整数时.这是一个相当年龄的情况,但绝对应该注意.

+(null)==0 而 isNaN(+undefined)

考虑到NaN是JavaScript中唯一不等于它的值,你可以做一些非常疯狂的事情,比如:

+undefined == +undefined // false
+null == +null // true
Run Code Online (Sandbox Code Playgroud)

如果您不打算将值转换为整数,则使用null松散等式==替换undefined是安全的.这是一个非常优秀的案例场景.

Mik*_*uel 6

语言规范的第11.9.3节中的抽象等式算法是定义的==,!=并且它定义它们

null == void 0
null == null
void 0 == null
Run Code Online (Sandbox Code Playgroud)

哪里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.
...
Run Code Online (Sandbox Code Playgroud)

如果您担心的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
Run Code Online (Sandbox Code Playgroud)

从语言规范:

11.4.2无效算子

生产UnaryExpression:void UnaryExpression的计算方法如下:

  1. 让我们expr评估UnaryExpression/的结果.
  2. 打电话GetValue(expr).
  3. 返回undefined.

因此,void前缀运算符计算其参数并返回特殊值undefined,而不管全局变量的undefined更改(或是否undefined已定义:).

编辑:回应评论,

如果您正在处理区分两者的库代码,那么您需要处理差异.语言委员会标准化的一些新图书馆确实忽略了这些差异:JSON.stringify([void 0]) === "[null]"但是有太多的代码可以巧妙地区别对待它们,还有其他差异:

+(null) === 0
isNaN(+undefined)

"" + null === "null"
"" + undefined === "undefined"
Run Code Online (Sandbox Code Playgroud)

如果您正在编写任何类型的库来生成文本或序列化/反序列化,并且您想要将两者合并,那么您无法undefined通过并期望它的行为null- 您需要明确地将输入标准化为一个或另一个.