检查对象属性并调用方法的更好方式

3

(如果之前已经查询过了,很抱歉,我没有找到)

我曾经这样检查一个对象和方法是否存在,并调用它:

 obj && obj.method && obj.method()

但是,我怀疑这可能会在IE上造成一些麻烦...

我需要使用typeof undefined/function/object来检查它吗?

 typeof obj === 'object' && typeof obj.method === 'function' && obj.method()

我想知道编写代码的最安全、最清晰的风格是什么。

1
只有当您怀疑 obj.method 可能不是一个函数时。 - John Dvorak
你在IE中遇到了什么错误? - Bruno
1个回答

5
为了确保您可以在名为object的对象上正确执行名为method的方法,这是最短的安全检查:
if (typeof object === 'object' && typeof object.method === 'function') {
    object.method();
}

您需要先检查对象是否存在,然后确保您想要的属性是一个函数。任何其他的检查都是冗余的。

请注意,如果您有像数字0或布尔值false与您正在尝试执行的method属性之类的奇怪东西,则此方法会失败,但如果您将属性附加到布尔值和数字上,则可能会有更大的问题。


如果object未定义,它将引发一个ReferenceError异常。 - VisioN
现在它与 OP 的解决方案没有任何区别 :) - VisioN
如果对象未定义,为什么不会被视为假?var object = object || {}; 与之前的变量有何区别? - Martin Borthiry
1
@MartinBorthiry,未定义值为undefined之间有区别(如果将其放在if语句中,将会抛出异常,而编辑会保护它)。在if语句中,值为undefined将被计算为false - jbabey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接