在JavaScript中,全局undefined在ES5之前可被修改,导致类型判断失效。本文详解如何通过void 0运算符或IIFE未传参技巧获取受信任的undefined,确保代码安全与语义准确。
undefined的可变性风险
在JavaScript语言中,若需判断变量是否为undefined,常规写法如下:
if(a === undefined){//code}
然而,JavaScript中的undefined并非绝对可靠。例如定义如下函数:
function test(a) {
var undefined = 1;
console.log(undefined); // => 1
if(a===undefined) {
// ...
}
}
执行结果可见,undefined被轻易赋值为1,这导致后续对undefined的判断产生歧义。因此,在JavaScript中将undefined直接等同于“未定义”存在风险,因为该标识符可能被人为篡改。
ES5标准下的只读保护
在ES5标准之前,全局undefined属性是可写的;而ES5将其设为只读。若浏览器支持ES5,可在控制台验证:
undefined = 1;
console.log(undefined); // => undefined
使用void运算符获取受信任值
既然标识符undefined不再能直接反映“未定义”语义,需借助其他手段获取可信值。JavaScript提供了void运算符,它对指定表达式求值并返回受信任的undefined:
void expression
最常用的获取方式是void 0,当表达式为0时运算开销最小:
void 0;
// or
void(0);
所有需要获取undefined的场景,均可用void 0替代。
利用IIFE获取undefined
此外,还有另一种获取方式。熟悉jQuery源码的开发者应知立即执行函数(IIFE)的用法:
(function(window,undefined) {
// ...
})(window)
在该函数中,未传递第二个参数(形参名为undefined),因此该参数默认值为“未定义”。通过此方式,函数作用域内的undefined均为受信任的值。
以上即为JavaScript中关于undefined不可靠性的详细解析,更多相关内容请查阅本站其他文章。