对象的枚举是指遍历完对象包含的属性,用for循环
var wangjia = {
wife1: {
name: "xiaoli"
},
wife2: {
name: "xiaozhao"
},
wife3: {
name: "xiaozhang"
},
wife4: {
name: "xiaowang"
},
sayWife: function(num) {
return this["wife" + num];
}
};
for (var prop in wangjia) {
console.log(prop);
}
将对象里面的属性和方法名都打印出来,但我们还没法知道具体的属性值!
var wangjia = {
wife1: {
name: "xiaoli"
},
wife2: {
name: "xiaozhao"
},
wife3: {
name: "xiaozhang"
},
wife4: {
name: "xiaowang"
},
sayWife: function(num) {
return this["wife" + num];
}
};
for (var prop in wangjia) {
console.log(wangjia.prop);
}
这里的.操作在后台转换为wangjia[‘prop’],但是对象wangjia 并没有prop属性,所以只会打印5 个 undefined!
var wangjia = {
wife1: {
name: "xiaoli"
},
wife2: {
name: "xiaozhao"
},
wife3: {
name: "xiaozhang"
},
wife4: {
name: "xiaowang"
},
sayWife: function(num) {
return this["wife" + num];
}
};
for (var prop in wangjia) {
console.log(wangjia[prop]);
}
只会打印出属性值,没有属性名!所以说要注意区别变量和属性!
但是他会将手动修改的所以属性,包括原型身上的都打印出来!所以引申出一个判断是否在他身上的属性的函数 hasOwnProperty
var wangjia = {
wife1: {
name: "xiaoli"
},
wife2: {
name: "xiaozhao"
},
wife3: {
name: "xiaozhang"
},
wife4: {
name: "xiaowang"
},
sayWife: function(num) {
return this["wife" + num];
},
__proto__: {
wa: "uu"
}
};
for (var prop in wangjia) {
if (!wangjia.hasOwnProperty(prop)) {
console.log(wangjia[prop]);
}
}
确实只打印出原型身上的属性!
A对象 instanceof B对象 是指A对象是否是B的构造函数构造出来的!这是官方的解释,但是wangjia对象明显不是Object的构造函数,但是他的原型链上有Object的原型!–》所以最后,这个函数准确来说是判断A对象的原型链上是否有B的原型!
区分数组还是对象,var arr = [] || {}?如何判断呢
数组其实算做一种对象!
方法一:他们的constructor不一样!
方法二:既然数组是一种对象,那么数组的原型链上一定有对象的原型
而对象的原型链上没有数组的原型!
方法三:使用Object.prototype.toString.call([])
将[]数组按照Object的原型的toString的方法打印!