当前位置: 首页 > news >正文

广州市国外网站建设平台百度快速收录软件

广州市国外网站建设平台,百度快速收录软件,美国建设新闻网站,中国百强企业for in 如果让你遍历对象中的key和value,你第一个想到的一定是使用for in const o{name:"chengqige",age:23 } for (let key in o){console.log(key,o[key]); }看起来是没有问题的,但是如果我在下面加一行代码,输出的结果就可能让…

for in

如果让你遍历对象中的key和value,你第一个想到的一定是使用for in

const o={name:"chengqige",age:23
}
for (let key in o){console.log(key,o[key]);
}

看起来是没有问题的,但是如果我在下面加一行代码,输出的结果就可能让你觉得奇怪了

const o = {name: "chengqige",age: 23
}
Object.prototype.getName = function () {}
Object.prototype.test = 12
for (let key in o) {console.log(key, o[key]);
}

你会发现for in多打印出了两行东西,它们分别是Object原型上的方法和属性getNametest
,那么这个是为什么呢?

因为for in会打印原型上的所有可以被枚举的方法

什么是可枚举?

在JS中我们给一个对象添加属性一共有三种办法:

1.通过点语法直接添加属性

const o={}
o.a=1
for(let key in o){console.log(key)
}

输出结果:a

2.通过动态索引添加
什么是动态索引?我们普遍认为一个对象的key是写死的,value是变量,key不可编程,value可以被赋值

// 变量
const value=12
const o={"写死的":value
}

但是实际上我们的 key也是可以用变量控制的,请看下面的例子

const value=12
const key ="动态索引"
const o={[key]:value
}

我们使用[]来扩起来变量,表示这个属性是动态的,是有外部变量控制的

3.通过API添加
es6新增一个API可以直接为对象添加属性

const o = {"b": 12
}
Object.defineProperty(o, "a", {get() {return 1}
})
for (let key in o) {console.log(key);
}
console.log("i am here", o.a)

但是它的输出结果是:

问题出现了,为什么for in没有出这个属性a,但是我们使用o.a可以打印出来它
因为for in只能遍历可以被枚举的属性,我们改造一下代码,让我们新添加的a是可以被枚举的就好了

Object.defineProperty(o, "a", {get() {return 1},// +新增enumerable: true
})

这一次我们发现for in打印的结果就有a了

什么是原型

原型是与生俱来固有的对象,原型里有很多开箱即用的方法,因此在创建某些对象的同时,这个方法就可以被使用了。
比如数组中的push、pop、shift、unshift

任何数组都可以用它们,难道不是嘛

var arr = []
arr.push(1,2,3,4)
// [1,2,3,4]

那么这些原型上的方法是官方的,所以它们是不可以被枚举的,那么用for…in遍历它是没有的

// 这个点语法创造的天生可以被枚举,动态索引也是
Array.prototype.mine = function(){}
for (let key in Array.prototype){console.log(key,'只有可以枚举的才会出现哦')
}

如果你在浏览器环境下运行这个代码:

<script>Array.prototype.mine = function () { }console.log(Array.prototype);for (let key in Array.prototype){console.log(key,'只有可以枚举的才会出现哦')}
</script>

深色的表示这些属性是可以被枚举的,浅色的表示这些属性是不可被枚举的,谷歌浏览器用颜色深浅来划分

那么我们可以不可以让这些不可枚举的方法设置成可枚举的呢?当然可以!

Array.prototype.mine = function () { }
Object.defineProperty(Array.prototype, "push", {get(){return 1},enumerable: true})console.log(Array.prototype);for (let key in Array.prototype) {console.log(key, '只有可以枚举的才会出现哦')}let arr=[]arr.push(1,3)console.log(arr);

总结

for … in不是一个很好的方法,它会把原型链上所有可枚举的方法打印

Object.prototype.mine = function () { }
Array.prototype.okkk = function () { }
let arr = [1, 2, 3]
for (let key in arr) {console.log(key)
}

在这里插入图片描述

const o = {name: "chengqige",age: 23
}
Object.prototype.getName = function () {}
Object.prototype.test = 12
for (let key in o) {console.log(key, o[key]);
}

替代方案

Object.keys(o).forEach()

const o = {name: "chengqige",age: 23
}
Object.prototype.getName = function () {}
Object.prototype.test = 12
Object.keys(o).forEach(key=>{console.log(key, o[key]);
})

for in+hasOwnProperty

const o = {name: "chengqige",age: 23
}
Object.prototype.getName = function () {}
Object.prototype.test = 12
for (let key in o) {if(o.hasOwnProperty(key)){console.log(key, o[key]);}
}

上面两种的输出结果都是

http://www.lbrq.cn/news/2504611.html

相关文章:

  • 石油 技术支持 东莞网站建设百度搜索技巧
  • 武汉品牌网站建设公司哪家好北京百度推广电话
  • 网站怎么做限时抢购江苏网站建设推广
  • 哪个网站做批发最便宜吗网页制作软件哪个好
  • 做网站申请域名大概花费多少it培训机构出来能找到工作吗
  • 珠海中企网站建设网络推广员每天的工作是什么
  • 巨野菏泽网站建设安卓手机优化软件排名
  • 北京做家政网站有哪些平台app拉新推广平台渠道
  • 安徽省住房和城乡建设厅证件查询保定seo外包服务商
  • 免费外贸电商平台seo专业培训学费多少钱
  • 微信企业app下载安装seo成功案例分析
  • 网站描述标签怎么写做网页怎么做
  • 网站域名注册费用优化网站收费标准
  • 做网站游戏怎么挣钱搜索引擎优化seo公司
  • html网站建设流程品牌整合营销案例
  • 备案平台新增网站长沙网站优化
  • 做php网站廊坊网络推广公司
  • 汽车之家网站系统是什么做的2022年十大网络流行语发布
  • 长沙建网站培训机构seo网站排名查询
  • 网站建设 流程 域名申请百度的广告
  • 网站集群怎么做交换友情链接吧
  • 什么网站做的靠枕比较有创意免费的网站域名查询
  • 果业局网站建设百度网盘网页登录入口
  • 东阳高端营销型网站建设品牌软件测试培训班多少钱
  • 如何创建免费网站最新国际新闻事件
  • 广州网站建设哪家有1000个关键词
  • 一级a做爰片完整网站官方网站营销
  • 如何开始做b2b网站网店推广常用的方法
  • 怎么做门户网站设计广州网站优化平台
  • 旅游网站开发实现开题报告惠州网站建设
  • MCP error -32000: Connection closed
  • React Immer 不可变数据结构的处理
  • 第4章唯一ID生成器——4.2 单调递增的唯一ID
  • 【历史人物】【韩愈】简历与生平
  • 标签驱动的可信金融大模型训练全流程-Agentar-Fin-R1工程思路浅尝
  • cJSON在STM32单片机上使用遇到解析数据失败问题