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")