首页 > JavaScript > 如何检查 JavaScript 中的对象属性是否未定义?

如何检查 JavaScript 中的对象属性是否未定义?

上一篇 下一篇

如何检查 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`");
}

分割线

网友回答:

这里的许多答案都是强烈推荐的,但这是一个糟糕的选择。它永远不应该用于检查变量是否有值,因为它充当对值和变量是否存在的组合检查。在绝大多数情况下,您知道变量何时存在,并且如果您在变量名称或字符串文字中输入拼写错误,只会引入静默失败的可能性。typeoftypeofundefinedundefinedtypeof'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 foofunction bar(foo) { … }bar()undefined
  • 可以覆盖。确实,这不是关键字,但它只读且不可配置的。还有其他内置功能,尽管它们的非关键字状态(,,…)并且实用代码通常不是在主动恶意环境中编写的,但您可能不会避免,因此这不是担心的好理由。(但是如果你正在编写代码生成器,请随意使用。undefinedundefinedObjectMathNaNundefinedvoid 0

随着变量的工作方式,是时候解决实际问题了:对象属性。没有理由用于对象属性。关于特征检测的早期例外在这里不适用 – 仅对变量具有特殊行为,并且引用对象属性的表达式不是变量。typeoftypeof

这:

if (typeof foo.bar === 'undefined') {
    ⋮
}

始终完全等同于此³:

if (foo.bar === undefined) {
    ⋮
}

并考虑到上面的建议,为了避免让读者对你为什么使用 ,因为它用于检查相等性最有意义,因为它可以重构为稍后检查变量的值,并且因为它看起来更好,你应该始终在这里使用 === undefined³typeof===

当涉及到对象属性时,要考虑的其他事情是你是否真的要检查。给定的属性名称可以出现在对象上(读取时产生值),在对象本身上以值存在,在对象的原型上以值存在,或者存在于具有非值的任何一个上。 会告诉你一个键是否在对象的原型链上的任何位置,并会告诉你它是否直接在对象上。不过,我不会在这个答案中详细介绍原型和使用对象作为字符串键映射,因为它主要是为了反驳其他答案中的所有错误建议,而不管对原始问题的可能解释如何。阅读 MDN 上的对象原型以了解更多信息!undefinedundefinedundefinedundefinedundefined'key' in objObject.prototype.hasOwnProperty.call(obj, 'key')

¹ 示例变量名称的不寻常选择? 这是来自 Firefox NoScript 扩展的真正死代码。
² 不过,不要以为不知道范围内的内容通常是可以的。 滥用动态范围导致的额外漏洞: 零项目 1225
³ 再次假设 ES5+ 环境,并且未定义是指全局对象的未定义属性。

模板简介:该模板名称为【如何检查 JavaScript 中的对象属性是否未定义?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【JavaScript】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 210次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-22
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信文章 html5 微信图片 响应式 微信公众平台 自适应 微信模板 单页式简历模板 微信素材 企业网站
您可能会喜欢的其他模板