浅谈JavaScript中的属性:如何遍历属性


Posted in Javascript onSeptember 14, 2017

在JavaScript中,遍历一个对象的属性往往没有在其他语言中遍历一个哈希(有些语言称为字典)的键那么简单。这主要有两个方面的原因:一个是,JavaScript中的对象通常都处在某个原型链中,它会从一个或多个的上层原型上继承一些属性.第二个原因是,JavaScript中的属性不光有值,它还有一些除了值以外的其他特性,其中一个影响属性遍历的特性就是[[Enumerable]],如果该值为true,则称这个属性是可枚举的,否则反之。

知道了这些,我们就可以把属性的遍历分为四种情况.

注:示例代码中,我们要遍历的对象是浏览器中的window,环境为Firefox 19,代码运行在空白页面中的script标签里。没有Firebug或者其他调试工具的影响(会导入一些全局变量,console等)。

1.遍历可枚举的自身属性

可枚举的意思就是该属性的[[Enumerable]]特性为true,自身属性的意思就是该属性不是从原型链上继承下来的.

(function () {
 var propertys = Object.keys(window);
 alert(propertys.length);   //3
 alert(propertys.join("\n"));  //window,document,InstallTrigger,除了最后一个是火狐私有的属性,原来window对象只有两个可枚举的自身属性.window属性指向window对象自身,一般没什么用.
})()

2.遍历所有的自身属性

特性为不可枚举的属性也并不是遍历不到,ES5给我们提供了getOwnPropertyNames方法,可以获取到一个对象的所有自身属性.

(function () {
 var propertys = Object.getOwnPropertyNames(window);
 alert(propertys.length);  //72
 alert(propertys.join("\n")); //Object,Function,eval等等
})()

3.遍历可枚举的自身属性和继承属性

继承属性怎么遍历,你应该知道,就是最常用的for in遍历

(function () {
 var getEnumPropertyNames = function (obj) {
  var props = [];
  for (prop in obj) {
   props.push(prop);
  }
  return props;
 }
 var propertys = getEnumPropertyNames(window);
 alert(propertys.length);  //185
 alert(propertys.join("\n")); //addEventListener,onload等等
})()

4.遍历所有的自身属性和继承属性

这种遍历主要用在各种js调试工具的代码补全功能上.比如Firebug的.

(function () {
 var getAllPropertyNames = function (obj) {
  var props = [];
  do {
   props = props.concat(Object.getOwnPropertyNames(obj));
  } while (obj = Object.getPrototypeOf(obj));
  return props;
 }
 var propertys = getAllPropertyNames(window);
 alert(propertys.length);   //276
 alert(propertys.join("\n"));  //toString等
})()

以上这篇浅谈JavaScript中的属性:如何遍历属性就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js获取单元格自定义属性值的代码(IE/Firefox)
Apr 05 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
Sep 12 Javascript
jQuery Mobile 导航栏代码
Nov 01 Javascript
Javascript中string转date示例代码
Nov 01 Javascript
谈谈JavaScript自定义回调函数
Oct 18 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
Mar 16 Javascript
JS验证逗号隔开可以是中文字母数字
Apr 22 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
Jun 08 Javascript
jQuery实现模拟flash头像裁切上传功能示例
Dec 11 Javascript
详解如何webpack使用DllPlugin
Sep 30 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
Jan 18 jQuery
微信小程序顶部导航栏可滑动并选中放大
Dec 05 Javascript
基于node.js express mvc轻量级框架实践
Sep 14 #Javascript
gulp教程_从入门到项目中快速上手使用方法
Sep 14 #Javascript
利用jsonp与代理服务器方案解决跨域问题
Sep 14 #Javascript
基于js中document.cookie全面解析
Sep 14 #Javascript
基于Vue过渡状态实例讲解
Sep 14 #Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
Sep 14 #Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
Sep 14 #Javascript
You might like
改进的IP计数器
2006/10/09 PHP
Zend Studio 无法启动的问题解决方法
2008/12/04 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
php判断终端是手机还是电脑访问网站的思路及代码
2013/04/24 PHP
解析php防止form重复提交的方法
2013/07/01 PHP
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
PHP多文件上传类实例
2015/03/07 PHP
javascript之AJAX框架使用说明
2010/04/24 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
2016/01/26 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
2020/05/10 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
Python压缩和解压缩zip文件
2015/02/14 Python
详解python中xlrd包的安装与处理Excel表格
2016/12/16 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
python实现大学人员管理系统
2019/10/25 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
利用python实现逐步回归
2020/02/24 Python
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
财务人员个人自荐信范文
2013/09/26 职场文书
商务英语本科生的自我评价分享
2013/11/15 职场文书
主治医师岗位职责
2013/12/10 职场文书
演讲稿怎么写
2014/01/07 职场文书
宠物店的创业计划书范文
2014/01/11 职场文书
解除施工合同协议书
2014/10/17 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android
MySQL数据库查询之多表查询总结
2022/08/05 MySQL