for in 与 for of, 与 hasOwnProperty

本文探讨了HTML5自定义属性的使用,并通过JavaScript展示了如何正确遍历DOM节点,避免因枚举原型属性导致的问题。文章还介绍了hasOwnProperty方法及for...of循环的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天本来想尝试下HTML5的自定义属性

<div data-name='byset1'>1</div>
<div data-name='byset'>2</div>
<div data-name='byset3'>3</div>
<div data-name='byset'>4</div>
<div data-name='byset5'>5</div>
<script>    
  var getDom = document.querySelectorAll('div')
  
  for (let i in getDom) {  
    console.log(getDom[i].dataset)
  }    
</script>

结果打印出来多了6个undefined

才发现原来for in 会把prototype的属性也枚举出来

解决这个问题可以通过检测hasOwnProperty过滤

<script>    
  var getDom = document.querySelectorAll('div')  
  for (let i in getDom) {  
    if (getDom.hasOwnProperty(i)) {
      console.log(getDom[i].dataset)
    }
  }    
</script>

--插个官方的解释--


描述

所有继承了 Object 的对象都会继承到 hasOwnProperty 方法。这个方法可以用来检测一个对象是否含有特定的自身属性;和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。

示例

使用 hasOwnProperty 方法判断属性是否存在

下面的例子检测了对象 o 是否含有自身属性 prop:

o = new Object();
o.prop = 'exists';

function changeO() {
  o.newprop = o.prop;
  delete o.prop;
}

o.hasOwnProperty('prop');   // 返回 true
changeO();
o.hasOwnProperty('prop');   // 返回 false

自身属性与继承属性

下面的例子演示了 hasOwnProperty 方法对待自身属性和继承属性的区别:

o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop');             // 返回 true
o.hasOwnProperty('toString');         // 返回 false
o.hasOwnProperty('hasOwnProperty');   // 返回 false

遍历一个对象的所有自身属性

下面的例子演示了如何在遍历一个对象的所有属性时忽略掉继承属性,注意这里 for...in  循环只会遍历可枚举属性,所以不应该基于这个循环中没有不可枚举的属性而得出 hasOwnProperty 是严格限制于可枚举项目的(如同 Object.getOwnPropertyNames())。

var buz = {
    fog: 'stack'
};

for (var name in buz) {
    if (buz.hasOwnProperty(name)) {
        alert("this is fog (" + name + ") for sure. Value: " + buz[name]);
    }
    else {
        alert(name); // toString or something else
    }
}


或者直接用for of解决这个问题,听说for in是es5时代的东西,因为这个弊端,在es6时代推出了for of,直接遍历value

<script>    
  var getDom = document.querySelectorAll('div')  
  for (let val of getDom) {  
    console.log(val.dataset)    
  }    
</script>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值