使用无效的合并运算符 ( ??
),人们很想使用它来指定不存在的对象键的默认值,如此处的答案中所建议的那样,例如:
let a = foo.bar ?? 'default';
但是,在这种情况下,它的替代方案(主要是in
和hasOwnProperty
)有它们的警告和风险。调用<key> in <object>
匹配对象原型链中的键,如此处所述。例如,如果对象被遮蔽,调用<object>.hasOwnProperty(<key>)
将不起作用,如此处所述。当然,有它自己的陷阱需要提防。hasOwnProperty
??
??
与检查任何对象中是否存在键的其他方法相比,有哪些陷阱?
换句话说,是否存在以下风险:
let a = foo.bar ?? 'default';
更接近于此
let a = 'bar' in foo ? foo.bar : 'default';
或这个
let a = foo.hasOwnProperty('bar') ? foo.bar : 'default';
或这个
let a = Object.prototype.hasOwnProperty.call(foo, 'bar') ? foo.bar : 'default';
或者它们与任何一个都不同?