与未定义的 属性 进行比较不是 JavaScript 中的错误

Comparing against an undefined property is not an error in JavaScript

在 JavaScript 中,涉及未定义属性的比较被评估为 false,而不是抛出错误,即使在 "strict" 模式下也是如此。 这在我的代码中造成了不止一个难以解决的错误。

有没有办法 a) 检测这些错误,或 b) 减轻它们?

> let x = {foo: 1}
> x.foo == 2 // Sensible behaviour
false
> x.floo // Where floo is a typo.
ReferenceError: floo is not defined
> x.floo == 2 // Nonsensical behaviour
false

您可以检查item === undefined

或者在涵盖这种情况的对象原型中定义额外的属性 .isNull()

Object.defineProperty(Object.prototype, 'isNull', {
    value: function (obj) {
        return (obj === null || obj === undefined);
    }
});

用法:

if(Object.isNull(x)) {
    ....
}

虽然@jonrsharpe 是绝对正确的,如果您需要那种级别的控制,您应该使用 Typescript,只是为了好玩,这里有一个纯粹的 javascript 实现。将你的对象包裹在 strict(...) 中,你将在未定义的道具上得到引用错误:

const SPECIAL_PROPS = [
    // well-known symbols
    ...Object.getOwnPropertyNames(Symbol).map(p => Symbol[p]),
    // used by JSON.strinfigy
    'toJSON',
    // something else?
];

let strict = obj => new Proxy(obj, {
    get(t, p) {
        if (p in t)
            return t[p];
        if (!SPECIAL_PROPS.includes(p))
            throw new ReferenceError(`property ${String(p)} is not defined`);
    }
});

let x = strict({foo: 1})
x.foo == 2 // Sensible behaviour
x.floo == 2 // Reference error

不用说,这是一个纯粹的运行时检查,有点违背了整个目的。

您可以尝试使用 Proxy

let x = {foo: 1}

let handler = {
  get: function(target,prop,reciver){
      if(!target.hasOwnProperty(prop)){
        throw new Error('Sorry property do not exist')
      } else{
        return target[prop]
      }
  }
}

let proxy = new Proxy(x,handler)

console.log(proxy.foo)
console.log(proxy.floo)