# 遍历对象

# for...in

遍历自身属性及原型链属性

	var ninja = {name:'jack',age:24}
	for(var i in ninja){
		console.log(i+':'+ninja[i])
	}

	// name:jack
	// age:24

	var ninjaConstructor = function(){
		this.arm = 'sword'
	}
	ninjaConstructor.prototype = ninja;
	var ninja2 = new ninjaConstructor()
	for(var i in ninja2){
		console.log(i+':'+ninja2[i])
	}
	//arm:sword
	//name:jack
	//age:24

所以,for...in 会把对象原型链prototype继承的属性枚举出来。

# hasOwnProperty

返回一个布尔值,判断属性是否存在(不会查找原型链)

ninja2.hasOwnProperty('arm')  //true
ninja2.hasOwnProperty('name') //false

所以 for...in 循环避免遍历原型链的做法

for (var i in ninja2) {
	if (ninja2.hasOwnProperty(i)) {
		console.log(i)
	}
}

思考:如果obj中定义了ninja2.hasOwnProperty = '123'怎么办?

上面的假设是可能发生的,因为hasOwnProperty不是js的保留字。

# 最佳做法:

for (var i in ninja2) {
	if (Object.prototype.hasOwnProperty.call(ninja2, i)) {
		console.log(i)
	}
}

# for...in 和 for...of 的区别

for...in 可以遍历对象和数组
for...of 只能遍历数组,类似 forEach, 直接得到值

var arr = [{name:'张三'},{name:'李四'}];
for (var i of arr){
  console.log(i)
}
// {name:'张三'}
// {name:'李四'}

for...of 不能用于对象。