众所周知,当声明一个变量,而且没有给赋值的状况下,它的初始值是 undefined
。
可是在javascript中,怎么检查一个值是否为 undefined
呢?javascript
在现代浏览器中,你能够安全的直接比较将变量是与 undefined
进行比较java
if (name === undefined) { //... }
一些人反对直接使用 undefined
变量进行比较,由于在旧的浏览器中它容许被从新赋值,像下面这样:git
undefined = "test"
在被从新赋值后,直接使用 undefined
将不能正确的检测一个变量是否被赋值。
然而,这一行为在2009年的ECMAScript 5被修复了。github
15.1.1.3 undefined
The value of undefined is undefined (see 8.1). This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.undefined
的值是undefined
。这个属性有不可写,不可枚举,不可配置的特性。浏览器
在现代浏览器中,undefined
的值将不能被重写安全
一般undefined
指令是安全的。在应用中并无什么理由须要修改undefined
的值。
Thomas的回答使用具备说服力的推理,论证了这一点。函数
我没有遵从人们告诉我,我不该该使用
setTimeout
,由于有人能够(这样用):工具
window.setTimeout = function () { alert("Got you now!"); };
下面一行,它能够从新定义参数,替换原始值,使
raw === undefined
看起来是假的。es5
若是你仍然很在乎,有两个方法在即便全局 window.undefined
已经被重写的状况下,依然能够检查一个值是否为 undefined
。翻译
if (name === void(0)) { //... }
在这个例子中 0
没有任何实际意义,你想要使用 1
or function(){}
也无所谓。 void(anything)
都会计算获得undefiend
另一种选择,你可使用typeof
操做符安全地检查是否已经被赋值。你能够检查一个值的类型是否为 "undefined
" 代替与全局的 undefined
比较.
if (typeof name === "undefined") { //... }
注意第二个选择与前一个方案稍微有点差别。虽然name
没有被声明,typeof
仍然会说他是 undefined
。若是你直接使用 name
与 undefined
or void(0)
你会获得ReferenceError
异常的错误.
在代码中避免使用void(0)
或者 typeof x === "undefined"
,这些表达式不是自解释的,应该包装在isUndefined function
函数中,像这样:
function isUndefined(value){ //得到undefined,保证它没有被从新赋值 var undefined = void(0); return value === undefined; }
许多的工具库已经部署了这个方法,例如: _.isUndefined
,underscore中的isUndefined方法
原文地址
原文标题:在javascript中怎样检查undefiend
初次翻译,若有错误,欢迎指正