任何东西都没有在 JavaScript 中定义,是 undefined,不管它是 Object/Array 中的属性还是只是一个简单的变量...
JavaScript 有typeof,它可以很容易地检测到未定义的变量。
只需检查 typeof whatever === 'undefined' 是否会返回一个布尔值。
AngularJs v.1x 中著名的函数isUndefined() 就是这样写的:
function isUndefined(value) {return typeof value === 'undefined';}
所以当你看到函数接收一个值时,如果该值已定义,它将返回false,否则对于未定义的值,返回true。
那么让我们看看当我们传递值时会产生什么结果,包括像下面这样的对象属性,这是我们拥有的变量列表:
var stackoverflow = {};
stackoverflow.javascipt = 'javascript';
var today;
var self = this;
var num = 8;
var list = [1, 2, 3, 4, 5];
var y = null;
我们检查它们如下,您可以在它们前面看到结果作为评论:
isUndefined(stackoverflow); //false
isUndefined(stackoverflow.javascipt); //false
isUndefined(today); //true
isUndefined(self); //false
isUndefined(num); //false
isUndefined(list); //false
isUndefined(y); //false
isUndefined(stackoverflow.java); //true
isUndefined(stackoverflow.php); //true
isUndefined(stackoverflow && stackoverflow.css); //true
如您所见,我们可以在代码中使用类似这样的内容来检查任何内容,如前所述,您可以在代码中简单地使用 typeof,但如果您一遍又一遍地使用它,请创建一个类似 angular 示例的函数我按照 DRY 代码模式分享并继续重复使用。
还有一件事,要检查实际应用程序中对象的属性,即使该对象是否存在也不确定,请先检查该对象是否存在。
如果您检查对象的属性并且该对象不存在,则会抛出错误并停止整个应用程序的运行。
isUndefined(x.css);
VM808:2 Uncaught ReferenceError: x is not defined(…)
如此简单,您可以像下面这样将 if 语句包裹起来:
if(typeof x !== 'undefined') {
//do something
}
这也等于 Angular 1.x 中的 isDefined...
function isDefined(value) {return typeof value !== 'undefined';}
其他 javascript 框架(如 underscore)也有类似的定义检查,但如果您还没有使用任何框架,我建议您使用 typeof。
我还添加了来自 MDN 的这一部分,其中包含有关 typeof、undefined 和 void(0) 的有用信息。
严格相等和未定义
您可以使用未定义和严格相等和不等运算符来确定变量是否具有
一个值。在下面的代码中,变量 x 没有定义,并且
if 语句的计算结果为 true。
var x;
if (x === undefined) {
// these statements execute
}
else {
// these statements do not execute
}
注意:严格相等运算符而不是标准相等
此处必须使用运算符,因为 x == undefined 还会检查是否
x 为空,而严格相等则不是。 null 不等于
不明确的。有关详细信息,请参阅比较运算符。
Typeof 运算符和未定义
或者,可以使用 typeof:
var x;
if (typeof x === 'undefined') {
// these statements execute
}
使用 typeof 的一个原因是,如果
变量尚未声明。
// x has not been declared before
if (typeof x === 'undefined') { // evaluates to true without errors
// these statements execute
}
if (x === undefined) { // throws a ReferenceError
}
但是,应该避免这种技术。 JavaScript 是一个
静态范围的语言,所以知道变量是否被声明可以
通过查看它是否在封闭上下文中声明来阅读。这
唯一的例外是全局范围,但全局范围必须
全局对象,因此检查变量中是否存在
全局上下文可以通过检查属性的存在来完成
全局对象(例如使用 in 运算符)。
空运算符和未定义
void 运算符是第三种选择。
var x;
if (x === void 0) {
// these statements execute
}
// y has not been declared before
if (y === void 0) {
// throws a ReferenceError (in contrast to `typeof`)
}
更多 > here