判断动态属性存在应优先使用in、hasOwnProperty或Reflect.has:in检测含原型链的属性,hasOwnProperty严格检查自身属性(推荐Object.prototype.hasOwnProperty.call),Reflect.has语义清晰且对null/undefined报错;避免用obj[computedKey] !== undefined以防undefined值误判。
直接用 in 运算符或 hasOwnProperty 方法配合方括号语法即可,关键在于把计算结果作为字符串传进去,而不是写死属性名。
适合判断属性是否存在,不管是不是对象自身拥有,包括继承来的属性。
computedKey in obj,其中 computedKey 是字符串类型的结果const key = 'user' + id; if (key in data) { ... }
key 必须是字符串;若为数字或 symbol,in 会自动转成字符串(数字会转,symbol 不会,会报错)适合严格检查对象是否“自己定义”了该属性,排除原型链干扰。
obj.hasOwnProperty(computedKey)
Object.prototype.hasOwnProperty.call(obj, computedKey),避免对象自身重写了 hasOwnProperty
const field = `${type}Count`; if (Object.prototype.hasOwnProperty.call(config, field)) { ... }
ES6 新增的 API,行为等价于 in,但更函数式,且明确要求第一个参数是对象。
Reflect.has(obj, computedKey)
obj 为 null 或 undefined 而静默失败,而是直接抛错,利于调试别用 obj[computedKey] !== undefined 来判断——如果属性值恰好是 undefined,就会误判为“不存在”。
const user = { name: undefined }; const k = 'name'; user[k] !== undefined // false,但属性确实存在
in、hasOwnProperty 或 Reflect.has
computedKey 是字符串:可加 String(key) 或模板字面量兜底