我以前用来打字有点凌乱的typeof obj !== "undefined"
成语。但是,我注意到了angular.isDefined(obj)
方法。文档说如果没有定义给定的对象,它将返回false。然而,它实际上做的事情(至少在Firefox中)只是失败了,说" obj没有定义"。我错过了什么吗?
答案 0 :(得分:11)
tl; dr; :angular.isDefined(obj)
不能完全替代typeof
。
我错过了什么吗?
我不这么认为。 typeof
是一个特殊的运算符,如果根本不存在obj
,则不会抛出错误。但是,将变量传递给函数将导致尝试读取变量的值,因此如果它不存在则抛出错误。没有办法阻止这种情况。
AFAIK typeof
是唯一一个遇到引用错误时不会抛出的运算符。另一方面,如果您必须测试变量是否存在,那么您的代码可能设计得很差(除非您必须测试"功能"(如第三方模块)的存在)。
预期行为的示例:
var foo;
var bar = 42;
typeof foo !== 'undefined'; // false
typeof bar !== 'undefined'; // true
typeof baz !== 'undefined'; // false
isDefined(foo); // false
isDefined(bar); // true
isDefined(baz); // ReferenceError
答案 1 :(得分:3)
在Javascript中以任何方式访问真正未定义的变量,tyepof
除外引发错误。您只能将 Angular.isDefined 与属性一起使用。例如,这样可以正常工作:
Angular.isDefined(window.obj);
因为 obj 是窗口的未定义属性。
答案 2 :(得分:0)
我尝试这样的事情:
try {
if (angular.isDefined (obj.a.b)) {
// do something with obj.a.b
}
} catch (e) {
// handle cases if any of (obj, obj.a, obj.a.b) is not defined
}
这样我就不会得到任何异常,如果没有定义对象层次结构中的任何引用属性。