for...in 与 for...of

Object.keys(..) 
会返回一个数组,包含所有可枚举属性,
Object.getOwnPropertyNames(..) 会返回一个数组,包含所有属性,无论它们是否可枚举。
propertyIsEnumerable(..) 会检查给定的属性名是否直接存在于对象中(而不是在原型链 上)并且满足 enumerable:true。

// 让 b 不可枚举  
Object.defineProperty(myObj,"b",{ enumerable: false, value: 3 } )
for...in 是遍历不出b属性的
(for..in 循环可以用来遍历对象的可枚举属性列表(包括 [[Prototype]] 链))
还有就是for...in遍历无法直接获取属性值

ES6 增加了一种用来遍 历数组的for...of 循环语法(如果对象本身定义了迭代器的话也可以遍历对象):
var myArray = [ 1, 2, 3 ];for(let v of myArr) console.log(v);
for..of 循环首先会向被访问对象请求一个迭代器对象,然后通过调用迭代器对象的 next() 方法来遍历所有返回值。


但是 b in myObj 却是true(可以通过 in 操作符来判断是否存在)

hasOwnProperty(..) 只会检查属性是否在 myObj 对象中,不会检查 [[Prototype]] 链。

所有的普通对象都可以通过对于 Object.prototype 的委托来访问 hasOwnProperty(..)
但是有的对象可能没有连接到Object.prototype(通过 Object.create(null)来创建)
这时可以使用一种更加强硬的方法来进行判断:Object.prototype.hasOwnProperty. call(myObj,"a")
原文地址:https://www.cnblogs.com/pittle-z/p/14071017.html