- Published on
检测未定义的对象属性
- Authors
- Name
JavaScript是一门灵活的编程语言,经常需要我们去检测变量或对象属性是否已定义。本文将分享一些实用的技巧和方法,帮助开发者在不同的场境下检测未定义的变量和对象属性。
typeof
检测未定义的变量
使用 在JavaScript中,如果某个变量没有被定义,那么它的值是undefined
。typeof
运算符可以让我们轻松地检测一个变量是否是未定义的:
if (typeof whatever === 'undefined') {
// true if 'whatever' is undefined
}
这是AngularJs v.1.x中著名的isUndefined()
函数的实现:
function isUndefined(value) {
return typeof value === 'undefined';
}
当传递一个值到函数中,如果该值已定义,则返回false
;否则,对于未定义的值,返回true
。
实际示例
让我们来看看一些实际的变量和对象属性检测的结果:
var stackoverflow = {};
stackoverflow.javascript = 'javascript';
var today;
var self = this;
var num = 8;
var list = [1, 2, 3, 4, 5];
var y = null;
console.log(isUndefined(stackoverflow)); // false
console.log(isUndefined(stackoverflow.javascript)); // false
console.log(isUndefined(today)); // true
console.log(isUndefined(self)); // false
console.log(isUndefined(num)); // false
console.log(isUndefined(list)); // false
console.log(isUndefined(y)); // false
console.log(isUndefined(stackoverflow.java)); // true
console.log(isUndefined(stackoverflow.php)); // true
console.log(isUndefined(stackoverflow && stackoverflow.css)); // true
从上面的示例我们可以看到,利用typeof
来检测未定义是非常简单且有效的。如果你在代码中多次使用这种检查,可以考虑创建一个类似Angular的函数以保持代码的DRY(Don't Repeat Yourself)原则。
检查对象属性是否存在
在实际应用中,如果我们不确定对象是否存在,那么在检查其属性时,需要先确定对象存在:
if(typeof x !== 'undefined') {
// do something
}
这相当于Angular 1.x
中的isDefined
函数:
function isDefined(value) {
return typeof value !== 'undefined';
}
其他JavaScript框架如Underscore.js也有类似的定义检查,但还是推荐直接使用typeof
,特别是在没有使用框架的情况下。
来自MDN的更多信息
严格相等与未定义
以下代码中,变量x
未定义,if语句结果为true:
var x;
if (x === undefined) {
// 这些语句会执行
} else {
// 这些语句不会执行
}
注意: 这里必须使用严格相等操作符而不是标准相等操作符,因为x == undefined
还会检查x
是否为null
,而严格相等不会。null
与undefined
不相等,详细可见比较操作符。
typeof
运算符和未定义
同样,我们可以使用typeof
:
var x;
if (typeof x === 'undefined') {
// 这些语句会执行
}
使用typeof
的一个理由是,如果变量没有被声明,不会抛出错误:
// x 在之前没有被声明
if (typeof x === 'undefined') {
// 这些语句会执行且没有错误
}
if (x === undefined) {
// 会抛出ReferenceError
}
Void
运算符和未定义
void
运算符是另一种选择:
var x;
if (x === void 0) {
// 这些语句会执行
}
// y 在之前没有被声明
if (y === void 0) {
// 会抛出ReferenceError
}
更多细节可以参考MDN文档。