今天从新来认识一下 JavaScript 基本数据类型中的 undefined。javascript
The global undefined property represents the primitive value undefined. It is one of JavaScript's primitive types.java
全局对象的 undefined 属性表明的值为原始值 undefined 。同时 undefined 也是 JavaScript 中原始类型之一。在浏览器环境中全局对象即为 window,也就是说 undefined 是 window 对象的一个属性(全局做用域的一个变量),而且初始值为 undefined。浏览器
对于 undefined 值可能出现的状况:函数
前面有提到 undefined 实际上是一个全局对象的属性也就是一个全局变量,既然是一个变量理论上咱们就能够修改它的值。下面咱们来尝试 修改一下ui
var undefined = 123;
// 在浏览器运行能够看出其实,并无修改为功;而且在严格模式下修改 undefined 的值会报错;
console.log(undefined);
复制代码
从图中能够看出其实,undefined 虽然做为 window 对象的属性可是是只读的,因此没法修改。spa
在现代浏览器(JavaScript 1.8.5/Firefox 4+),自ECMAscript5标准以来undefined是一个不能被配置(non-configurable),不能被重写(non-writable)的属性。即使事实并不是如此,也要避免去重写它。code
既然做为全局对象没法修改那么做为局部对象是否能够修改呢?试试下面的代码:cdn
// 不要这样作!
// 打印 'foo string' 说明 undefined 的值和类型都已经改变
(function() {
var undefined = 'foo';
console.log(undefined, typeof undefined)
})()
// 打印 'foo string' 说明 undefined 的值和类型都已经改变
(function(undefined) {
console.log(undefined, typeof undefined)
})('foo')
复制代码
上面的示例能够看出 undefined 不是 JavaScript 中的保留字。undefined 其实在非全局做用域中是能够和普通变量名同样的使用,其值是能够被修改的。可是不推荐这样写,这样容易致使咱们的代码难以维护和排查错误!!!对象
既然 undefined 的值在有些状况可能被修改,那么咱们用下面的方式来判断一个变量是否为 undefined 就存在了必定的风险。blog
var name = 'foo';
if (name === undefind) {
// ...
}
复制代码
因此咱们不能直接经过 undefined 的变量来获取值,能够使用 void(0) 的方式来获取一个 undefined 值。void 运算符是用来对给定的表达式进行求值,而后返回 undefined。这样拿到的运算结果是一个比较准确的 undefined 值,不论 undefined 是否被修改。因此我么的判断方式能够这样:
// 方式一
var name;
if (name === void 0) {
// ...
}
// 方式二
if(typeof name === 'undefined') { // 没有错误,执行结果为true
console.log('name is ' + typeof y ) // name is undefined
}
// 【推荐】判断是否为 undefined 是一个比较常见的操做,能够封装一个方法。这样在使用的时候一方面更符合语义比较直观,另外一方面判断更加准确
function isUndefined(o) {
return o === void 0;
}
var user;
if (isUndefined(user)) {
// ...
}
复制代码
最后简单总结一下: