与未定义的 属性 进行比较不是 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)
在 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)