JavaScript——for…… in……循环性能问题

JS循环优化与属性遍历
本文探讨了JavaScript中不同循环方法的特点与优化策略,对比了for...in循环、Object.keys()、Object.getOwnPropertyNames()及Reflect.ownKeys()在属性遍历上的差异,强调了在特定场景下选择合适方法的重要性。

问题:

使用for……in……循环会遍历原型链所有的可枚举属性,如果你的目的不是需要所有属性,会造成不必要的循环

const div =document.createElement('div')
let m =0
for (let k in div){
    m++
} 
console.log(m) //235
console.log(Object.keys(div).length)  //0

优化:

除了用for……in……可以获取 obj 中的 key 值,还可以使用 Object.key() 获取,Object.getOwnPropertyNames() 以及Reflect.ownKeys() 也可以获取,for……in…… 循环:会遍历对象自身的属性以及原形属性,for……in…… 循环只遍历可枚举属性(不包括 enumerable 为 false 的属性)。像 Array 和 Object 使用内置构造函数所创造的对象会继承自Object.prototype 和String.prototype 的不可枚举属性

const parent = {
  a: 1,
  b: 2,
  c: 3
};
const child = {
  d: 4,
  e: 5,
  [Symbol()]: 6
};
child.__proto__ = parent;
Object.defineProperty(child, "d", { enumerable: false });//设置child对象中的d属性为不可枚举
for (var attr in child) {
  console.log("for...in:", attr);// a,b,c,e
}
console.log("Object.keys:", Object.keys(child));// [ 'e' ]
console.log("Object.getOwnPropertyNames:", Object.getOwnPropertyNames(child)); // [ 'd', 'e' ]
console.log("Reflect.ownKeys:", Reflect.ownKeys(child)); // [ 'd', 'e', Symbol() ]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值