如何安全地检查对象是否具有属性或方法?

时间:2015-06-16 01:14:05

标签: javascript

.hasOwnProperty()不检查继承的成员,in运算符不适用于所有类型的对象(例如字符串和null

欢迎使用库(尤其是Lodash.js)的解决方案。

我正在编写一个函数,它试图找出一个对象是否类似于数组(包括字符串)。我无法直接与.hasOwnProperty()核对,因为属性可以继承:

function isArrayLike(val) {
    return 'length' in Object(val)
}

另一个例子:

function stringify(val) {
    if ('toJSON' in Object(val))
        return JSON.stringify(val.toJSON())
    else
        return JSON.stringify(val)
}

so(如果参数是原语,'toJSON' in Object(val)不会中断)

prop in Object(val)似乎很有效

1 个答案:

答案 0 :(得分:3)

实际上,in operator仅适用于对象:

  

如果Type( rval )不是Object,则抛出 TypeError 异常。

因此,只需检查它确实是一个对象:

obj === Object(obj) // Filter out non-objects
&& prop in obj      // Check property

请注意,布尔值,数字,字符串和符号是原始值,因此它们没有属性。但是,它可能看起来相反,例如"string".valueOf。这是有效的,因为在底层创建了一个字符串对象,该对象继承了valueOf的{​​{1}}属性。

如果您想测试此项,可以使用

String.prototype