划重点

本篇笔者将重点介绍JavaScript中 getOwnPropertyNames 、Object.keys、for ... in 的使用及他们之间的异同点。

getOwnPropertyNames

Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。

那么啥叫自身属性呢?请看下面代码段:

var obj = {
    a: '1',
    b: '2'
}
var newObj=Object.create(obj) // 创建 newObj ,原型指向 obj newObj.c="3"; // 向 newObj 添加属性 c

以上代码段中,newObj 的自身属性只有一个 c,具有2个原型属性 a 和 b。下面贴上该代码在 Chrome 控制台中的结构。

了解了 自身属性 和原型属性后,我们接着看啥叫 不可枚举属性呢?请看下面代码段:

var obj = {
    a: '1',
    b: '2'
} var newObj=Object.create(obj) // 创建 newObj ,原型指向 obj newObj.c="3"; // 向 newObj 添加属性 c // 使用 属性描述API为 newObj 添加属性 d,其值为 d, 不可被枚举
Object.defineProperty(newObj, 'd', {
    value: "d",
    enumerable: false //不可被枚举
})

笔者使用ES5的 defineProperty 为newObj添加了一个新属性,并用属性描述符做了一些限制,enumerable 标记该属性不能被枚举。

弄清楚 自身属性、原型属性、不可枚举 这些概念后我们开始验证 getOwnPropertyNames。

如上图使用 getOwnPropertyNames,正确获取到 c 和 d 2个属性。

for...in

for...in 语句以任意顺序遍历一个对象的除Symbol以外的可枚举属性。

划重点:for...in 可以遍历 自身可枚举属性、原型上的可枚举属性。还是上面的那段代码,我们在 Chrome 控制台中验证结果。

实验结果中我们正确得到了 自身属性c、原型属性 a 和 b,并且输出是无序的。这里你可能会问,newObj 的原型是 obj,那么 obj 的原型又是 基本包装类型object,为啥 object的属性(如 toString)没有被输出?  那是因为js中基本包装类型的原型属性是不可枚举的,如Object, Array, Number等。

Object.keys

Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 。如果对象的键-值都不可枚举,那么将返回由键组成的数组。

划重点:Object.keys() 可以遍历 自身可枚举属性,这些属性返回顺序无序。还是上面的那段代码,我们在 Chrome 控制台中验证结果。

同样的代码 我们只获取到了 自身属性 c。

总结

本文原文地址:https://www.limitcode.com/detail/5d5fe62a10dcbf0b1852b307.html

《你不知道的Javascript》感悟篇—对象属性遍历的那些事的更多相关文章

  1. js 对象属性遍历

    function 对象属性遍历(){ var obj = {x:1,y:2,c:3};for (var name in obj){ alert ( obj[name] )} } function 数组 ...

  2. JavaScript基础之对象属性的检测和枚举

    属性检测 对象作为属性的集合,属性又包括自有属性和继承属性: 检测方法: \__   in运算符: \__ var obj = { x:1 } console.log( 'toString' in o ...

  3. javascript 简单语法 对象属性及方法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 二十一、JavaScript之访问对象属性

    一.代码如下 二.执行效果如下 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" cont ...

  5. javascript基础(六)对象

    原文http://pij.robinqu.me/ JavaScript Objects 创建对象 对象直接量 var o = { foo : "bar" } 构造函数 var o ...

  6. Javascript对this对象的理解

    在JavaScript中this表示函数运行的时候自动生成的一个内部对象,只能在函数内部使用,下面是一个简单的例子: function test(){ alert(this == window); } ...

  7. JavaScript 中的延迟加载属性模式

    传统上,开发人员在 JavaScript 类中为实例中可能需要的任何数据创建属性.对于在构造函数中随时可用的小块数据来说,这不是问题.但是,如果在实例中可用之前需要计算某些数据,您可能不想预先支付该费 ...

  8. JavaScript 对象属性的遍历

    ES6一共有5种方法可以遍历对象的属性. (1)for...in for...in循环遍历对象自身的和继承的可枚举属性(不含Symbol属性). (2)Object.keys(obj) Object. ...

  9. 6、JavaScript进阶篇③——浏览器对象、Dom对象

    一.浏览器对象 1. window对象 window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法: 注意:在JavaScript基础篇中,已讲解了部分属性,windo ...

随机推荐

  1. java-mybaits-016-mybatis知识点StatementType

    1.statementType 在mapper文件中可以使用statementType标记使用什么的对象操作SQL语句. statementType:标记操作SQL的对象 要实现动态传入表名.列名,需 ...

  2. 我的一个PLSQL【我】 循环嵌套、游标使用、变量定义、查询插入表、批量提交事务、字符串截取、动态sql拼接执行

    代码块: --CREATE OR REPLACE PROCEDURE PRO_REVENUE_STATISTICS --IS DECLARE --计数器 ins_counter PLS_INTEGER ...

  3. 【php】PHP制作QQ微信支付宝三合一收款码

    分析 微信扫这个,支付宝扫那个,不仅要加载多张二维码,还要加css/js让它变的好看,作为一个又懒又不想写这些东西的程序猿来说,这可不行. 那能不能把QQ微信支付宝三合一,只需要扫一个收款码就行呢? ...

  4. python解决排列组合

    笛卡尔积:itertools.product(*iterables[, repeat]) import itertools for i in itertools.product('BCDEF', re ...

  5. Siamese Net

    参考博客:https://blog.csdn.net/ybdesire/article/details/84072339

  6. webpack配置babel-loader

    需要安装的插件: cnpm i -D babel-core babel-loader babel-plugin-syntax-jsx babel-plugin-transform-runtime  b ...

  7. 未处理的异常:system.io.file load exception:无法加载文件或程序集“ 。。。。 找到的程序集的清单定义与程序集引用不匹配。

    问题描述: 添加控制器的时候,突然就报了这个错: Unhandled Exception: System.IO.FileLoadException: Could not load file or as ...

  8. networkx详细教程

    写在前面:城市计算研究中经常涉及到图论的相关知识,而且常常面对某些术语时,根本不知道在说什么.最近接触了NetworkX这个graph处理工具,发现这个工具已经解决绝大部分的图论问题(也许只是我自己认 ...

  9. [计算机视觉][ARM-Linux开发]OpenCV 3.1下载 ippicv_linux_20151201失败

    安装OpenCV 3.1的过程中要下载ippicv_linux_20151201,由于网络的原因,这个文件经常会下载失败. 解决的办法是手动下载: 先下载 OpenCV 3.1 Download MD ...

  10. 【计算机视觉】车牌识别开源框架EasyPR介绍

    之前学习了一个GitHub开源的框架,GitHub地址为: https://github.com/liuruoze/EasyPR  希望通过此篇博客详细阐述如何一步步实现车牌的识别过程.  车牌识别分 ...