logo
Published on

检测未定义的对象属性

Authors
  • Name
    Twitter

JavaScript是一门灵活的编程语言,经常需要我们去检测变量或对象属性是否已定义。本文将分享一些实用的技巧和方法,帮助开发者在不同的场境下检测未定义的变量和对象属性。

使用 typeof 检测未定义的变量

在JavaScript中,如果某个变量没有被定义,那么它的值是undefinedtypeof 运算符可以让我们轻松地检测一个变量是否是未定义的:

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,而严格相等不会。nullundefined不相等,详细可见比较操作符

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文档