-1

使用无效的合并运算符 ( ??),人们很想使用它来指定不存在的对象键的默认值,如此处的答案中所建议的那样例如:

let a = foo.bar ?? 'default';

但是,在这种情况下,它的替代方案(主要是inhasOwnProperty)有它们的警告和风险。调用<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';

或者它们与任何一个都不同?

4

1 回答 1

1

当您知道期望什么样的对象时,您所谈论的风险是无关紧要的,在您的特定情况下是具有bar属性的对象。没有Object.prototype.bar

在属性访问之后使用的“风险”与进行??属性访问的风险完全相同。你的陈述let a = foo.bar ?? 'default';相当于

let a = foo.bar == null ? 'default' : foo.bar;

或(不访问该属性两次)

let a = foo.bar;
if (a == null) a = 'default';
于 2022-01-14T13:37:46.733 回答