如果“obj”未定义,angular.isDefined(obj)不起作用

时间:2014-06-12 18:31:57

标签: javascript angularjs

我以前用来打字有点凌乱的typeof obj !== "undefined"成语。但是,我注意到了angular.isDefined(obj)方法。文档说如果没有定义给定的对象,它将返回false。然而,它实际上做的事情(至少在Firefox中)只是失败了,说" obj没有定义"。我错过了什么吗?

3 个答案:

答案 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
    }

这样我就不会得到任何异常,如果没有定义对象层次结构中的任何引用属性。