繁体   English   中英

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

[英]How do I safely check if an object has a property or a method?

.hasOwnProperty()不检查继承的成员,并且in运算符不适用于所有类型的对象(例如string和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)
}

因此(如果参数是原始类型'toJSON' in Object(val)中的'toJSON' in Object(val)不会中断)


prop in Object(val)似乎很棒

实际上, in运算符仅对以下对象起作用:

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

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

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

请注意,布尔值,数字,字符串和符号是原始值,因此它们没有属性。 但是,似乎相反,例如"string".valueOf 之所以可行,是因为在String.prototype创建了一个字符串对象,并且该对象从String.prototype继承了valueOf属性。

如果要对此进行测试,可以使用

obj != null            // Filter out undefined and null
&& prop in Object(obj) // Convert to object and check property

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM