# 遍历对象
# 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 不能用于对象。
← 正则表达式 node.js批量修改文件名 →