JavaScript空检查

我遇到了以下代码:

function (data) { if (data != null && data !== undefined) { // some code here } } 

我对JavaScript有点新鲜,但是从我在这里读到的其他问题来看,我觉得这个代码没有什么意义。


特别是, 这个答案指出

如果在typeof以外的任何上下文中访问一个未定义的variables,将会出错。

更新:上面的(引用)答案可能会引起误解。 它应该说“一个未声明的variables” ,而不是“一个未定义的variables”

正如我发现的那样,在Ryanmaericsnwellnhof的答案中 ,即使没有给函数提供任何参数,参数的variables总是被声明的。 这个事实也certificate了下面的列表中的第一项是错误的。


根据我的理解,可能会遇到以下情况:

  • 该函数没有参数被调用,因此使得data成为一个未定义的variables,并且在data != null上产生错误。

  • 该函数被特殊调用为null (或undefined )作为其参数,在这种情况下, data != null已经保护了内部代码,呈现&& data !== undefined无用。

  • 该函数被调用了一个非空参数,在这种情况下,它将平分地传递data != null data !== undefined

问:我的理解是否正确?


我已经在Firefox的控制台中尝试了以下内容:

 -- [15:31:31.057] false != null [15:31:31.061] true -- [15:31:37.985] false !== undefined [15:31:37.989] true -- [15:32:59.934] null != null [15:32:59.937] false -- [15:33:05.221] undefined != null [15:33:05.225] false -- [15:35:12.231] "" != null [15:35:12.235] true -- [15:35:19.214] "" !== undefined [15:35:19.218] true 

我无法弄清楚data != null 之后data !== undefined可能有什么用处。

“未定义的variables”与undefined的值不同。

一个未定义的variables:

 var a; alert(b); // ReferenceError: b is not defined 

一个undefined值的variables:

 var a; alert(a); // Alerts “undefined” 

当一个函数接受一个参数时,即使它的值是undefined ,也总是声明该参数,所以不会有任何错误。 你是正确的!= null后面!== undefined是无用的,虽然。

在JavaScript中, null是一个特殊的单例对象,有助于发送“没有价值”的信号。 你可以通过比较来testing它,像往常一样在JavaScript中,使用===运算符来避免混淆types强制是一个好习惯:

 var a = null; alert(a === null); // true 

正如@rynah所说,“未定义”在JavaScript中有点混乱。 但是,如果typeof(x)是string“undefined”,即使“x”不是一个声明的variables:

 alert(typeof(x) === 'undefined'); // true 

另外,如果variables没有被初始化,variables可以有“未定义的值”

 var y; alert(typeof(y) === 'undefined'); // true 

把它放在一起,你的支票应该是这样的:

 if ((typeof(data) !== 'undefined') && (data !== null)) { // ... 

但是,由于variables“data”总是被定义的,因为它是一个forms函数参数,所以使用“typeof”运算符是不必要的,您可以直接与“未定义的值”直接进行比较。

 function(data) { if ((data !== undefined) && (data !== null)) { // ... 

这段代码相当于说:“如果函数被调用了一个被定义的参数并且不为空…”

问:函数被调用时没有参数,从而使数据成为一个未定义的variables,并在数据!= null上产生错误。

答:是的, data将被设置为未定义。 请参阅10.5规范的声明绑定实例 。 但是访问一个未定义的值不会引发错误。 你可能会混淆这个访问一个未声明的variables在严格模式,这会产生一个错误。

问:该函数是专门用null(或undefined)作为参数调用的,在这种情况下,data!= null已经保护内部代码,呈现&&数据!== undefined无用。

问:这个函数是用一个非空参数调用的,在这种情况下,它将传递两个数据!= null和data!== undefined。

A:正确。 请注意,以下testing是等效的:

 data != null data != undefined data !== null && data !== undefined 

请参见第11.9.3节“抽象等式比较algorithm”和第11.9.6节规范的严格平等比较algorithm 。

typeof foo === "undefined"不同于foo === undefined ,不要混淆它们。 typeof foo === "undefined"是你真正需要的。 另外,使用!==代替!=

所以这个陈述可以写成

 function (data) { if (typeof data !== "undefined" && data !== null) { // some code here } } 

编辑:

对于未声明的variables,您不能使用foo === undefined

 var t1; if(typeof t1 === "undefined") { alert("cp1"); } if(t1 === undefined) { alert("cp2"); } if(typeof t2 === "undefined") { alert("cp3"); } if(t2 === undefined) // fails as t2 is never declared { alert("cp4"); } 

做你的testing的简单方法是:

 function (data) { if (data) { // check if null, undefined, empty ... // some code here } } 
 var a; alert(a); //Value is undefined var b = "Volvo"; alert(b); //Value is Volvo var c = null; alert(c); //Value is null