2011-07-26 241 views
9

在JavaScript中,undefined可以重新分配,所以通常建议创建一个自执行函数,以确保undefined实际上未定义。作为替代方案,nullundefined肯定是==,但其他任何值大致等于null/undefined将JavaScript undefined替换为null

(function(undefined){ 

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

})(); 

有:

TLDR

基本上你能安全地更换此

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

如果上面是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 
} 

的一个例外出现铸造undefined/null为整数时要。这是一个相当年龄的情况,但绝对应该注意。

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

考虑楠在JavaScript中唯一的价值不等于本身,你可以做一些很疯狂的事情,如:

+undefined == +undefined // false 
+null == +null // true 

使用null作为一个松散的平等==下降替代undefined是安全的,前提是您不打算将该值转换为整数。这是一个相当优势的情况。

回答

6

从语言规范的11.9.3节的abstract equality algorithm是什么定义==!=,它定义它们,这样

null == void 0 
null == null 
void 0 == null 

其中void 0是说的只是一种可靠的方法undefined(见下面)所以你的问题的答案是肯定的,null等于undefined本身,没有别的。

规范的相关部分

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:空隙UnaryExpression被评估如下:

  1. expr是评估结果UnaryExpression /。
  2. 致电GetValue(expr)
  3. 返回undefined

所以void前缀运算符计算它的参数,哪些全局变量undefined已经改变,无论到不确定返回特殊值(或者是否undefined定义:)。

编辑:在回应评论,

如果你正在处理这两者之间的区别,那么你需要处理的差异库代码。一些由语委标准化新库做忽视的区别:JSON.stringify([void 0]) === "[null]"但有太多的代码在那里,对待他们巧妙地不同,并且有其他方面的差异:

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

"" + null === "null" 
"" + undefined === "undefined" 

如果你正在写的任何种类生成文本或序列化/反序列化的库,并且想要将两者混淆,则不能通过undefined并期望它的行为如同null - 您需要明确规范化您的输入到其中一个或另一个。

+0

你可以像使用'void 0'一样在上面的代码中简单地使用'null'。我也可以争辩说'null'稍微容易阅读,然后输入'void 0'。我的观点是,区分两者似乎没有价值。尽管未定义应该表示“未知价值”,但没有人真正认可这一惯例。因此,忽略每个存在的“未定义”似乎是有益的,只需使用obj == null即可。 – William

+0

@Lime,请参阅我的编辑。 –

+0

谢谢,我不知道什么价值时被转换为整数。 “NaN”与“0”绝对不同。它看起来'[null] .join('')'和'[undefined] .join('')'是等同的。 – William

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是不是不确定的 - 它定义为空。

+0

我的观点是似乎没有区分两者的价值。虽然'undefined'应该表示一个“未知值”,但没有人真正认同这个约定。 – William

+0

假设您从未将任何内容分配给未定义的值,那么可以区分未变化的变量和取消的变量值。虽然,对于开发人员今天如何使用JS的所有实践目的,我可以看到您的观点...... – Brian

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年雅虎, 978-0-596-51774-8”

+0

最后一个是可怕的 – William

4

因为JavaScript有两个值。虽然其他语言可能只有nil/null的JavaScript长大undefined是“未知值”,而null显然是一个已知的值来表示什么。

比较var x,因为没有价值已被分配,其中x是不确定的和var y = null其中ynull。它被设定为某种东西 - 一个代表“无”的句子。的undefined VS在JavaScript null这个核心的基本用法运行速度非常深,其他情况包括:

  1. 一个缺失(或delete“d)财产也得到undefined,而不是null(这将导致null只有null已经分配)。
  2. 未分配的功能参数是undefined
  3. undefined从标准函数返回,如getElementById。看评论。

因此,在Javascript,它往往是更正确的使用undefined,而不是null他们都代表不同的事情。试图与之抗衡的图书馆正在与JavaScript斗争。

快乐编码。


个人而言,在几乎所有情况下,我避免undefinednull明确的检查。我认为,在大多数情况下(但并非全部),所有虚假价值观应该是相同的,并且呼吁方有责任遵守所述的公共合同。

因为这个信念,我会考虑在试图守卫太多,但太少边缘比较x == null,但在追赶nullundefined的情况下,它的工作原理,如指出。去开始一种趋势;-)

+1

DOM方法(如getElementById)返回null,因为undefined的概念不是目前在[WebIDL](http://www.w3.org/TR/WebIDL/)中,规范中有一个'void'类型,但它仅用于不产生任何值的操作。 – CMS

+0

好的答案,还会增加:'delete'与'= null'产生不同的结果('undefined')。 – Nicole

+0

人们实际上有多少次用“undefined”故意表示“未知值”?我从来没有见过这种情况,这就是我最初提出这个问题的原因。它似乎是两个令人难以置信的混淆值,它们从未用于其原始意图。标准化一切以做比较'obj == null'将有利于规模,并避免任何重新分配的问题。一切都会继续工作'var obj = {}; obj.nonExistantProperty == null'。 'var x; if(x == null);' – William