JavaScript undefined替换为null

时间:2011-07-26 17:30:35

标签: javascript null undefined

在JavaScript undefined中可以重新分配,因此通常建议创建一个自执行函数,以确保undefined实际上是未定义的。另外,nullundefined绝对是==,但是其他任何值都与null/undefined大致相等?

TLDR

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

(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代替==是安全的。这是一个非常优秀的案例。

4 个答案:

答案 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

来自language specification

  

11.4.2无效运算符

     

制作UnaryExpression: void UnaryExpression 评估如下:

     
      
  1. expr成为评估 UnaryExpression /。
  2. 的结果   
  3. 致电GetValue(expr)
  4.   
  5. 返回未定义
  6.   

因此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 ynull。它被设定为某种东西 - 一种代表“没有”的句子。 JavaScript中undefined vs null的核心基本用法非常深入,其他情况包括:

  1. 缺少(或delete'd)属性也会产生undefined而不是null(仅当null被分配时才会产生null )。
  2. 未分配的函数参数为undefined
  3. undefinedgetElementById 等标准函数返回。见评论。
  4. 因此,在Javascript 中,使用undefined而不是null通常更为正确。它们都代表不同的东西。试图解决这个问题的图书馆正在打击JavaScript。

    快乐的编码。


    就个人而言,在几乎所有情况下,我都避免对undefinednull进行明确检查。我认为,在大多数情况下 - 但不是全部 - 情况下,所有错误的价值都应该是等价的,并且呼叫者有责任遵守所述的公共合同。

    由于这种信念,我会认为比较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“。