如何检查 JavaScript 中的对象属性是否未定义?
网友回答:
我相信这个话题有很多不正确的答案。与通常的看法相反,“undefined”在JavaScript中不是一个关键字,实际上可以为其分配一个值。
执行此测试的最可靠方法是:
if (typeof myVar === "undefined")
这将始终返回正确的结果,甚至处理未声明的情况。myVar
var undefined = false; // Shockingly, this is completely legal!
if (myVar === undefined) {
alert("You have been misled. Run away!");
}
此外,在未声明 myVar 的情况下将引发错误。myVar === undefined
网友回答:
检查属性的值是否为特殊值 的常用方法是:undefined
if(o.myProperty === undefined) {
alert("myProperty value is the special value `undefined`");
}
要检查对象实际上是否没有这样的属性,因此当您尝试访问它时默认情况下会返回:undefined
if(!o.hasOwnProperty('myProperty')) {
alert("myProperty does not exist");
}
要检查与标识符关联的值是否是特殊值,或者该标识符是否尚未声明:undefined
if(typeof myVariable === 'undefined') {
alert('myVariable is either the special value `undefined`, or it has not been declared');
}
注意:最后一种方法是引用未声明标识符而没有早期错误的唯一方法,这与具有 .undefined
在 ECMAScript 5 之前的 JavaScript 版本中,全局对象上名为 “undefined” 的属性是可写的,因此,如果意外地重新定义了一个简单的检查,它可能会意外地运行。在现代 JavaScript 中,该属性是只读的。foo === undefined
但是,在现代JavaScript中,“undefined”不是一个关键字,因此函数中的变量可以命名为“undefined”并隐藏全局属性。
如果您担心这种(不太可能的)边缘情况,可以使用 void 运算符来获取特殊值本身:undefined
if(myVariable === void 0) {
alert("myVariable is the special value `undefined`");
}
网友回答:
这里的许多答案都是强烈推荐的,但这是一个糟糕的选择。它永远不应该用于检查变量是否有值,因为它充当对值和变量是否存在的组合检查。在绝大多数情况下,您知道变量何时存在,并且如果您在变量名称或字符串文字中输入拼写错误,只会引入静默失败的可能性。typeof
typeof
undefined
undefined
typeof
'undefined'
var snapshot = …;
if (typeof snaposhot === 'undefined') {
// ^
// misspelled¹ – this will never run, but it won’t throw an error!
}
var foo = …;
if (typeof foo === 'undefned') {
// ^
// misspelled – this will never run, but it won’t throw an error!
}
因此,除非您正在执行功能检测²,否则不确定给定名称是否在范围内(例如作为特定于 CommonJS 环境的代码中的步骤进行检查),在变量上使用时是一个有害的选择,正确的选择是直接比较值:typeof module !== 'undefined'
typeof
var foo = …;
if (foo === undefined) {
⋮
}
对此的一些常见误解包括:
var foo
function bar(foo) { … }
bar()
undefined
undefined
undefined
Object
Math
NaN
undefined
void 0
随着变量的工作方式,是时候解决实际问题了:对象属性。没有理由用于对象属性。关于特征检测的早期例外在这里不适用 – 仅对变量具有特殊行为,并且引用对象属性的表达式不是变量。typeof
typeof
这:
if (typeof foo.bar === 'undefined') {
⋮
}
始终完全等同于此³:
if (foo.bar === undefined) {
⋮
}
并考虑到上面的建议,为了避免让读者对你为什么使用 ,因为它用于检查相等性最有意义,因为它可以重构为稍后检查变量的值,并且因为它看起来更好,你应该始终在这里使用 === undefined
³。typeof
===
当涉及到对象属性时,要考虑的其他事情是你是否真的要检查。给定的属性名称可以出现在对象上(读取时产生值),在对象本身上以值存在,在对象的原型上以值存在,或者存在于具有非值的任何一个上。 会告诉你一个键是否在对象的原型链上的任何位置,并会告诉你它是否直接在对象上。不过,我不会在这个答案中详细介绍原型和使用对象作为字符串键映射,因为它主要是为了反驳其他答案中的所有错误建议,而不管对原始问题的可能解释如何。阅读 MDN 上的对象原型以了解更多信息!undefined
undefined
undefined
undefined
undefined
'key' in obj
Object.prototype.hasOwnProperty.call(obj, 'key')
¹ 示例变量名称的不寻常选择? 这是来自 Firefox NoScript 扩展的真正死代码。
² 不过,不要以为不知道范围内的内容通常是可以的。 滥用动态范围导致的额外漏洞: 零项目 1225
³ 再次假设 ES5+ 环境,并且未
定义是指全局对象的未定义
属性。
模板简介:该模板名称为【如何检查 JavaScript 中的对象属性是否未定义?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【JavaScript】栏目查找您需要的精美模板。