热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript学习笔记:对象属性检测

JavaScript对象可以看作是一个属性的集合,很多时候需要看某个属性是否存在于某个对象中。在JavaScript中对象属性的检测主要有以下几种方法。in运算符h
Javascript对象可以看作是一个属性的集合,很多时候需要看某个属性是否存在于某个对象中。在Javascript中对象属性的检测主要有以下几种方法。



in运算符

hasOwnProperty()方法

propertyIsEnumerable()方法

!==undefined

接下来看这四种方法怎么检测对象属性。



in运算符



使用in运算符可以检测对象属性,如果指定的属性存在于指定的对象中,就会返回true,反之返回的是false。



下面的例子演示了in是如何检测对象属性的。



var myCar = {

'make': 'Honda',

'model': 'Accord',

'year': 1998

}



'make' in myCar; // true

'name' in myCar; // false

'toString' in myCar; // true

在使用in运算符做对象属性检测时,运算符右侧必须是一个对象,比如可以是一个string包装的对象,但不能是一个字符串原始值。



var name = new String('w3cplus');

'length' in name; // true

'w3cplus' in name; // false



// Chrome输出

name => String {0: "w", 1: "3", 2: "c", 3: "p", 4: "l", 5: "u", 6: "s", length: 7, [[PrimitiveValue]]: "w3cplus"}

typeof name => object



var name = 'w3cplus';

'length' in name; //false

'w3cplus' in name; // false



// Chrome输出

name => "w3cplus"

typeof name => string

使用delete运算符删除了一个对象一个属性,这时使用in运算符检测删除的属性时会返回false:



var obj = {

'name': 'w3cplus',

'type': 'blog'

}



delete obj.name; // Object {type: "blog"}



name in obj; // false

如果你只是将一个属性的值赋值为undefined,而没有用delete删除它,这个时候使用in运算符检测对象属性时依旧会返回true。



var obj = {

'name': 'w3cplus',

'type': 'blog'

}



obj.url = undefined;



'url' in obj; // true

hasOwnProperty()方法



使用hasOwnProperty()方法可以判断某个对象是否含有指定的自身属性。使用这个方法,所有承继继承了Object.prototype的对象都会从原型链上继承到hasOwnProperty()方法上。而且该方法会忽略掉那些从原型上继承到的属性。



如果对象obj包含指定的prop属性的话,使用hasOwnProperty()方法将返回true值,反之将会返回false。



先来看个简单示例:



var obj = {

'name': 'w3cplus',

'type': 'blog'

}



obj.hasOwnProperty('name'); // true

obj.hasOwnProperty('toString'); // false

只有hasOwnProperty() 可以给出正确和期望的结果,这在遍历对象的属性时会很有用。 没有其它方法可以用来排除原型链上的属性,而不是定义在对象自身上的属性。



hasOwnProperty()方法只会查找自身属性,不会根据原型链进行查找。而且hasOwnProperty()方法在碰到对象拥有自已的hasOwnProperty方法时,其原型链上的同名方法hasOwnProperty()就会被遮蔽。



var foo = {

hasOwnProperty: function() {

return false;

},

bar: 'Here be dragons'

};



foo.hasOwnProperty('bar'); // 始终返回 false

如果担心hasOwnProperty()方法有可能被遮蔽的这种情况,可以直接使用原型链上真正的 hasOwnProperty方法:



({}).hasOwnProperty.call(foo, 'bar'); // true

Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

propertyIsEnumerable()方法



propertyIsEnumerable()方法是hasOwnProperty()方法的一个升级版。在Javascript中每个对象都有一个propertyIsEnumerable()方法。使用这个方法可以判断出指定的对象obj里的属性prop是否可枚举,也就是说该属性是否可以通过for...in循环遍历到,不过有些属性虽然可以通过 for...in 循环遍历到,但因为它们不是自身属性,而是从原型链上继承的属性,所以该方法也会返回false。如果对象没有指定的属性,该方法返回 false。



先来看一个propertyIsEnumerable()方法在普通对象和数组上的基本用法:



var obj = {};

obj.name = 'w3cplus is website';

obj.type = 'blog';



obj.propertyIsEnumerable('name'); // true

obj.propertyIsEnumerable('type'); // true

obj.propertyIsEnumerable(0); // false

obj.propertyIsEnumerable('toString'); // false

!==undefined



还有一种简单的方法可以判断对象的属性是否存在,通过属性!== undefined来判断。此时会检测自身和继承来的属性。之所以使用!==而不是!=是因为!==可以区分undefined和null。但是此方法有一个弊端,当属性存在且值为undefined时,无法做出准确判断。如:



var obj = {

x:"1",

y:undefined,

z:null

};

console.log(obj.x !== undefined); //true 属性存在

console.log(obj.y !== undefined); //false 此时会出现歧义,不能准确判断属性是不存在还是属性值为undefined

console.log(obj.z !== undefined); //true 属性存在

console.log(obj.z != undefined); //false != 不能区分undefined和null,将两者同等对待

console.log(obj.w !== undefined); //false 属性不存在

console.log(obj.toString !== undefined); //true 存在toString函数属性。

然而有一种场景只能使用in运算符,而不能使用上述属性访问的方式。in可以区分不存在的属性和存在的属性但其值为undefined。如下面的代码所示:



var obj = {

x : undefined // 属性显式赋值为undefined

}

obj.x !== undefined; //false,属性存在,但值为undefined

obj.y !== undefined; //false,属性不存在

"x" in obj; // true 属性存

"y" in obj; // false 属性不存在

delete obj.x; // 删除属性x

"x" in obj; // false 属性不存

总结



上面简单的整理了几种对象属性检测的方法,下面简单的做一下相关的总结:



in 自身存在的属性,继承的属性,返回true

hasOwnProperty() 自身存在的属性返回true,继承属性返回false

propertyIsEnumerable() 自身存在的属性,且为枚举属性返回true,

!== undefined 自身存在的属性,继承的属性,不能识别值为undefined的属性


推荐阅读
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
author-avatar
空瓶子姑娘_537
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有