博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS:for...in...,Objects.keys()和Object.getOwnPropertyNames的区别
阅读量:6437 次
发布时间:2019-06-23

本文共 2418 字,大约阅读时间需要 8 分钟。

hot3.png

简介

javascript是一门面向对象的语言,在javascript中,一切都是对象。对象的属性包括了数据属性和访问器属性,根据实际情况,我们又可以把对象的属性分为原型属性和实例属性。下面我们以三个例子来分别看看 for...in...,Object.keys和Object.getOwnPropertyNames 在遍历对象属性时的不同

for...in...

var testData = ["one","two","three"]var testMap = {"index1":1,"index2":2,"index3":3};function Person(name,sex){  this.name = "Thomas";  this.sex = "male";}Person.prototype.getName = function(){ return this.name} //拓展prototype属性for(var i in testData){  console.log(i);  //输出0,1,2   }for(var i in testMap){  console.log(i);// "index1","index2","index3"  返回所有的}var personOne = new Person();for(var prop in personOne){  console.log(prop) //name,sex,getName 返回可枚举的属性,包括原型链上的}

这里我们看到,利用for...in..遍历test时,输出的是0,1,2。为什么是这样子呢?其实我们可以把数组看成是

{  0:"one",  1:"two",  2:"three" }

这就是我们为什么可以通过test[0],test[1],test[2]来访问到这些数据的重要原因。

Object.keys()

var testData = ["one","two","three"]var testMap = {"index1":1,"index2":2,"index3":3};function Person(name,sex){  this.name = "Thomas";  this.sex = "male";}Person.prototype.getName = function(){ return this.name} //拓展prototype属性console.log(Object.keys(testData)); //["0", "1", "2"]console.log(Object.keys(testMap)); // "index1","index2","index3"  返回所有的var personOne = new Person();console.log(Object.keys(personOne));//["name", "sex"],无法获取原型链上的属性

Object.getOwnPropertyNames()

var testData = ["one","two","three"]var testMap = {"index1":1,"index2":2,"index3":3};function Person(name,sex){  this.name = "Thomas";  this.sex = "male";}Person.prototype.getName = function(){ return this.name} //拓展prototype属性console.log(Object.getOwnPropertyNames(testData)); //["0", "1", "2","length"],包括可枚举和不可枚举的属性console.log(Object.getOwnPropertyNames(testMap)); // "index1","index2","index3"  var personOne = new Person();console.log(Object.getOwnPropertyNames(personOne));//["name", "sex"],无法获取原型链上的属性

可以看到

方法 作用
for...in.. 以任意顺序遍历一个对象的可枚举属性,包括原型链上的
Object.keys() 返回对象的可枚举属性组成的数组
Object.getOwnPropertyNames 返回对象可枚举和不可枚举的属性,不包含Symbol值作为名称的值。

备注:对象属性的可枚举或者不可枚举可以通过Object.defineProperty来重新定义,例如,在前面的程序中,我们重新修改一下代码:

function Person(name,sex){  this.name = "Thomas";  this.sex = "male";}Person.prototype.getName = function(){ return this.name} //拓展prototype属性var personOne = new Person();Object.defineProperty(personOne,"name",{  enumerable: false,  configurable: false,  writable: false,})console.log(Object.keys(personOne));//结果是:["sex"],原本是 ["name","sex"].这是name属性变得不可枚举

 

参考链接:

转载于:https://my.oschina.net/u/2562868/blog/1552049

你可能感兴趣的文章
Model层视频播放关闭问题及手机视频播放的适配问题解决方案
查看>>
Cisco 2960 交换机密码设置
查看>>
超媒体API
查看>>
第六周网络攻防作业
查看>>
springboot 项目部署为war项目
查看>>
【MongoDB】2、安装MongoDB 2.6.1 on Unbuntu 14.04(学习流水账)
查看>>
iOS中AVFoundation的简单使用—音乐的播放
查看>>
win10 家庭版 CredSSP加密Oracle修正 设置方法
查看>>
在spring中使用自定义注解注册监听器
查看>>
Kalileo中DiagramGroup布局
查看>>
[转载] 大道至简:软件工程实践者的思想——第十章 是思考还是思想
查看>>
【Spring MVC】 maven pom.xml 错误: Cannot upgrade/downgrade to Dynamic Web Module 3.0 facet.
查看>>
我的友情链接
查看>>
Android:简易单词本(三)
查看>>
使用SCVMM2012从hyper-v 2.0平台往hyper-v 3.0平台迁移VM虚拟机的报错(2)
查看>>
RocketMQ的安装与配置
查看>>
Android studio 单元测试
查看>>
LINUX--特殊权限SUID,SGID,Sticky
查看>>
Java基础学习总结(1)——equals方法
查看>>
使用 MYSQLBINLOG 来恢复数据
查看>>