下面是MDN示例的摘录
var d = withValue.d || (
withValue.d = {
enumerable: false,
writable: false,
configurable: false,
value: value
}
);
这是检查属性是否存在的安全方法,否则分配并初始化它?如果没有,那么有没有一种更好,安全和优化的方法?
答案 0 :(得分:5)
不,这并不安全,因为该属性可能确实存在于对象上,但为 falsey ,在这种情况下,withValue.d ||
会失败并继续进行更改,将一个对象分配给尽管d
属性已经存在,但d
属性仍然存在。请改用hasOwnProperty
,并且不要将作业放在期望表达的地方:
if (!withValue.hasOwnProperty('d')) {
withValue.d = {
enumerable: false,
writable: false,
configurable: false,
value: value
}
}
const { d } = withValue;
如果d
属性(如果存在),将始终是一个对象,那么您的原始代码将起作用,因为对象始终是真实的。 (由于赋值即表达,代码仍然有点臭)
答案 1 :(得分:0)
in
个对象就像@certainperformance所说的那样,通过检查对象的值来检查其属性是否存在并不安全。相反,您可以使用JavaScript's in operator来简单地检查属性是否为in
对象:
if (!('d' in withValue)) {
withValue.d = { ... };
}
const { d } = withValue;
您可能会遇到的唯一问题是prop in obj
不仅会检查对象的属性,还会检查原型。但是,在大多数情况下,这可能还不错。