如何检查JavaScript中的对象属性是否未定义?
当前回答
也可以使用代理。它可以处理嵌套调用,但需要额外检查一次:
function resolveUnknownProps(obj, resolveKey) {
const handler = {
get(target, key) {
if (
target[key] !== null &&
typeof target[key] === 'object'
) {
return resolveUnknownProps(target[key], resolveKey);
} else if (!target[key]) {
return resolveUnknownProps({ [resolveKey]: true }, resolveKey);
}
return target[key];
},
};
return new Proxy(obj, handler);
}
const user = {}
console.log(resolveUnknownProps(user, 'isUndefined').personalInfo.name.something.else); // { isUndefined: true }
因此,您将像这样使用它:
const { isUndefined } = resolveUnknownProps(user, 'isUndefined').personalInfo.name.something.else;
if (!isUndefined) {
// Do something
}
其他回答
也可以使用代理。它可以处理嵌套调用,但需要额外检查一次:
function resolveUnknownProps(obj, resolveKey) {
const handler = {
get(target, key) {
if (
target[key] !== null &&
typeof target[key] === 'object'
) {
return resolveUnknownProps(target[key], resolveKey);
} else if (!target[key]) {
return resolveUnknownProps({ [resolveKey]: true }, resolveKey);
}
return target[key];
},
};
return new Proxy(obj, handler);
}
const user = {}
console.log(resolveUnknownProps(user, 'isUndefined').personalInfo.name.something.else); // { isUndefined: true }
因此,您将像这样使用它:
const { isUndefined } = resolveUnknownProps(user, 'isUndefined').personalInfo.name.something.else;
if (!isUndefined) {
// Do something
}
以下是我的情况:
我正在使用REST调用的结果。结果应该从JSON解析为JavaScript对象。
有一个错误我需要辩护。如果REST调用的参数不正确,并且用户指定了错误的参数,则REST调用基本上返回为空。
在使用这篇文章来帮助我抵御这一挑战时,我尝试了这样做:
if( typeof restResult.data[0] === "undefined" ) { throw "Some error"; }
对于我的情况,如果restResult.data[0]==“object”,那么我可以安全地开始检查其余成员。如果未定义,则抛出上述错误。
我想说的是,就我的情况而言,本文中之前的所有建议都不起作用。我并不是说我是对的,每个人都是错的。我根本不是一个JavaScript大师,但希望这会对某人有所帮助。
Object.hasOwnProperty(o,'propertyname');
然而,这并不能通过原型链进行查找。
function isUnset(inp) {
return (typeof inp === 'undefined')
}
如果变量已设置,则返回false;如果未定义,则返回true。
然后使用:
if (isUnset(var)) {
// initialize variable here
}
这是什么意思:“未定义的对象属性”?
实际上,这可能意味着两件截然不同的事情!首先,它可以表示对象中从未定义过的属性,其次,它可以指具有未定义值的属性。让我们看一下这段代码:
var o = { a: undefined }
o.a是否未定义?对其值未定义。是否未定义o.b?当然根本没有属性“b”!好了,现在看看不同的方法在两种情况下的表现:
typeof o.a == 'undefined' // true
typeof o.b == 'undefined' // true
o.a === undefined // true
o.b === undefined // true
'a' in o // true
'b' in o // false
我们可以清楚地看到,obj.prop==“undefined”和obj.prop==undefineed的类型是等价的,它们不能区分这些不同的情况。obj中的“prop”可以检测属性根本没有定义并且没有注意可能未定义的属性值的情况。
那该怎么办?
1) 您想知道一个属性是由第一个含义还是第二个含义定义的(最典型的情况)。
obj.prop === undefined // IMHO, see "final fight" below
2) 您只想知道对象是否具有某些属性,而不关心其值。
'prop' in obj
笔记:
不能同时检查对象及其属性。例如,此x.a==未定义或此类型的x.a=='未定义'引发ReferenceError:如果未定义x,则未定义x。变量undefined是一个全局变量(所以实际上它在浏览器中是window.unded)。自ECMAScript第1版以来,它一直受到支持,自ECMASript 5以来,它是只读的。因此,在现代浏览器中,它不能被重新定义为真实,因为许多作者喜欢用它来吓唬我们,但这对于旧浏览器来说仍然是真实的。
最后一战:obj.prop==未定义vs obj.prop类型==“未定义”
obj.prop的加号==未定义:
它短了一点,看起来更漂亮一点如果您拼错了undefined,JavaScript引擎会给您一个错误
obj.prop的最小值==未定义:
在旧浏览器中可以重写undefined
obj.prop类型的加号==“undefined”:
它真的很普遍!它可以在新旧浏览器中使用。
obj.prop类型的最小值==“undefined”:
这里的“undefined”(拼写错误)只是一个字符串常量,因此如果您像我刚才那样拼写错误,JavaScript引擎将无法帮助您。
更新(针对服务器端JavaScript):
Node.js支持未定义为global.undefined的全局变量(也可以在没有“global”前缀的情况下使用)。我不知道服务器端JavaScript的其他实现。