本人详细介绍了JS遍历对象N种方法,欢迎关注收藏。

遍历对象属性有五种方法,下图为一个场景对比图。

可以注意到两点:

  1. 只有for ... in 才可以遍历原型链属性,且只能遍历可枚举属性。
  2. Object.getOwnPropertyNames + Object.getOwnPropertySymbols = Reflect.ownKeys.

以上五种方法,用如下代码来做例子:

let obj = {enum_prop: "enum_val",[Symbol("symbol")]: "symbol"
};Object.defineProperty(obj,
"no_enum_prop",
{value: "no_enum_val", enumerable: false});Object.getPrototypeOf(obj).proto_enum_prop = "proto_enum_prop";

Object.keys

返回一个数组,包含对象自身所有enumerable属性(不含Symbol属性)的键名。

console.log(Object.keys(obj));
// 输出:["enum_prop"]

类似的其他两个函数为Object.values() 和Object.entries()。

console.log(Object.values(obj));
// 输出:["enum_val"]
console.log(Object.entries(obj));
// 输出:[[enum_prop: "enum_val"]]

for ... in

循环遍历对象自身和prototype的可枚举属性(不含Symbol属性)

for(let prop in obj){console.log(prop);
}
// 输出: enum_prop proto_enum_prop

Object.getOwnPropertyNames(obj)

返回一个数组,包含对象自身所有可枚举和不可枚举属性的(不含Symbol属性)的键名

console.log(Object.getOwnPropertyNames(obj));
// 输出:["enum_prop", "no_enum_prop"]

Object.getOwnPropertySymbols(obj)

返回一个数组,包含对象自身的所有Symbol属性的键名。

console.log(Object.getOwnPropertySymbols(obj));
// 输出:[Symbol(symbol)]

Reflect.ownKeys(obj)

返回数组,包含对象自身可枚举属性、不可枚举属性和Symbol属性。

console.log(Reflect.ownKeys(obj));
// 输出:["enum_prop", "no_enum_prop", Symbol(symbol)]

对象属性的顺序

对于对象属性的顺序,经常看到的说法是:ES5 没有制定,ES6按照如下方式:

  1. 值为整形的按照升序排序。
  2. 普通字符串的按照插入顺序。
  3. Symbol按照插入顺序。

但是,以下是我从MDN上找到:

for ... in: 返回的属性顺序是不确定的。以下来自MDN文档:

Object.keys(obj):返回顺序与for ... in 相同。以下来自MDN文档:

Object.getOwnPropertyNames(obj):返回顺序中可枚举属性和 for ...in相同,不可枚举属性的顺序没有定义,参见:

Object.getOwnPropertySymbols和Reflect.ownKeys,MDN文档没有说明顺序。

总结来说:避免依赖对象属性的顺序。

遍历对象属性_细说JS遍历对象属性的N种方法相关推荐

  1. js轮播图片小圆点变化_原生js实现轮播图(两种方法)

    第一种: 这个是之前写的,比较草率,没有注释,如果这个看不懂就去看第二个,比较仔细,主要是了解他,后面都会有一些插件来使用,很方便,只要几行代码就可写出各种各样的代码,所以,不懂的话,不要太在意, 第 ...

  2. js中当等于最小值是让代码不执行_网页中JS函数自动执行常用三种方法

    本文为大家分享了在网页中JS函数自动执行常用方法,供大家参考,具体内容如下 一.JS方法 1.最简单的调用方式,直接写到html的body标签里面: 2.在JS语句调用: function myfun ...

  3. js刷新页面有哪几种方法

    js刷新页面有哪几种方法 一.总结 一句话总结:location属性的reload方法即可:document.location.reload() 1.页面刷新有哪常见的8种方法? 1,history. ...

  4. html 点击事件阻止冒泡,js阻止事件冒泡的两种方法

    本篇文章给大家分享的内容是关于js阻止事件冒泡的两种方法 ,有需要的朋友可以参考一下 一.冒泡事件简介 当我们点击一个控件的时候,如果包括这个控件的父控件也有click事件,则会继续执行. 方法一:e ...

  5. iOS: JS和Native交互的两种方法,iosjsnative交互

    iOS: JS和Native交互的两种方法,iosjsnative交互 背景: UIWebView: iOS 用来展示 web 端内容的控件. 1. 核心方法: - (NSString*)string ...

  6. JS区分中英文字符的两种方法

    JS区分中英文字符的两种方法: 正则和charCodeAt()方法. 正则无疑是最强大的判断各种条件的方法, 最近也在研习它, 虽然枯燥, 但仍有乐趣. 用它来判断一个双字节的中文字符也是轻而易举地. ...

  7. JS数组转字符串(3种方法) arrays.join(“-“)把数组使用-分割为字符串

    JS数组转字符串(3种方法) JavaScript 允许数组与字符串之间相互转换.其中 Array 方法对象定义了 3 个方法,可以把数组转换为字符串,如表所示. Array 对象的数组与字符串相互转 ...

  8. js循环添加事件的两种方法

    js循环添加事件的两种方法 选择下拉列表中的一个li将文本传到框中 问题:写此二级菜单时用到的方法不好,对此进行优化 原始js代码: <script>// 思路:1.点击下拉框a时,ul中 ...

  9. JS实现深拷贝常用的几种方法

    JS实现深拷贝常用的几种方法 <!DOCTYPE html> <html lang="en"> <head><meta charset=& ...

最新文章

  1. git 建立一个私有模块
  2. Silverlight4 入门GetStart
  3. rocketmq之producer解析
  4. 3-unit1 IPv6网络的管理
  5. linux内核杂记(18)-内核链表结构(2)
  6. java + httpclient +post请求(记录下)
  7. O(n*m)复杂度的多重背包coinsPOJ 1742
  8. 驳!?使用游戏引擎是作弊行为的5个依据
  9. WordPress好看的QQ微信等登录插件二开美化版
  10. Filecoin Gas基础费率升至5.06 nanoFIL
  11. c语言break和return区别,C语言break,continue和return的区别
  12. SCI和影响因子:学术评估与商业运作——Nature实证研究
  13. php中的脚本加速扩展opcache
  14. [老老实实学WCF] 第五篇 再探通信--ClientBase
  15. 双缓冲技术解决java游戏图片闪现问题
  16. 这些初创公司为何要拒绝上亿美元的投资
  17. 基于SEIR模型对美国COVID-19疫情传播的预测和分析
  18. 百度云不限速下载(官方渠道,无风险)
  19. 洛谷 P1085 不高兴的津津 C语言
  20. 班旗怎么用软件设计,(最新整理)班旗设计大赛主持词

热门文章

  1. 关系数据库SQL之可编程性触发器
  2. android studio升级时提示 Connection failed. Please check your network connection and try again
  3. 设计模式系列漫谈之一 - 观察者模式
  4. css_01_承接部分html+css快速入门
  5. 4.1-大秦立国-ip演变
  6. linux的系统移植——交叉编译工具集
  7. Leetcode--5. 最长回文子串(java)
  8. 操作系统基本特性——并发、共享、虚拟、异步
  9. windows c++ 内存映射大文件问题记录
  10. python文件系统_你应该知道的10个Python文件系统方法