如何检测JavaScript原始值是否包含指定属性?
检测变量是否包含指定属性的通用方案
针对你遇到的问题——检测原始值(如字符串)是否包含某个原型链上的属性,这里有几个符合现代JS规范的通用解决方案:
方案1:使用Reflect.has()
这是最推荐的方式,Reflect.has()会自动处理原始值的装箱操作,无需手动转换对象,同时支持检测对象及原型链上的属性:
var x = 'some string'; if (Reflect.has(x, 'trim')) { console.log('x 包含 trim 属性'); }
方案2:将原始值转为包装对象后使用in操作符
通过Object()将原始值转换为对应的包装对象,再用in操作符检测:
var x = 'some string'; if ('trim' in Object(x)) { console.log('x 包含 trim 属性'); }
方案3:通过Object.getPrototypeOf()获取原型后检测
用标准的Object.getPrototypeOf()替代废弃的__proto__,获取值的原型对象后再用in操作符,注意需要先排除null和undefined(因为这两个值无法获取原型):
var x = 'some string'; if (x != null && 'trim' in Object.getPrototypeOf(x)) { console.log('x 包含 trim 属性'); }
补充说明
- 如果仅需检测自身属性(而非原型链上的),可以使用
Object.prototype.hasOwnProperty.call(x, prop),同样支持原始值:// 示例:检测对象自身是否有某个属性 var obj = { name: 'test' }; if (Object.prototype.hasOwnProperty.call(obj, 'name')) { console.log('obj 自身包含 name 属性'); } - 避免直接使用
x.hasOwnProperty(),因为如果x是null/undefined会报错,且如果对象重写了hasOwnProperty方法也会出问题。
内容的提问来源于stack exchange,提问作者LukasKroess
相关产品推荐
相关产品推荐

