JavaScript空检查
我遇到了以下代码:
function (data) { if (data != null && data !== undefined) { // some code here } }
我对JavaScript有点新鲜,但是从我在这里读到的其他问题来看,我觉得这个代码没有什么意义。
特别是, 这个答案指出
如果在typeof
以外的任何上下文中访问一个未定义的variables,将会出错。
更新:上面的(引用)答案可能会引起误解。 它应该说“一个未声明的variables” ,而不是“一个未定义的variables” 。
正如我发现的那样,在Ryan , maerics和nwellnhof的答案中 ,即使没有给函数提供任何参数,参数的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