1、使用 Object.prototype.hasOwnProperty.call(foo, 'bar'); 而不是用foo.hasOwnProperty('bar'); 的原因:
for in 可以遍历到对象的原型方法method,如果不想遍历原型方法和属性的话,可以在循环内部判断一下,hasOwnPropery方法可以判断某属性是否是该对象的实例属性
2、遍历对象
1)Object.keys()
方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。for(const k of Object.keys(formData)){ console.log('k:',k) }
2)
Object.entries()
方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环还会枚举原型链中的属性)for(const [k,v] of Object.entries(formData)){ console.log('k:',k,' v:',v) }
3)
for (let key in formData) { if (Object.prototype.hasOwnProperty.call(formData, key)) { console.log('key:',key) } }
总结:
1、for of
1)for of 适合遍历数组、map、set等拥有迭代器对象的集合,不能直接遍历对象,因为没有迭代器对象。
2)for of 与forEach()不同的是,它可以正确响应break、continue和return语句