for...in
for...in 循环只遍历可枚举属性。
Array和 Object使用内置构造函数所创建的对象都会继承自Object.prototype和String.prototype的不可枚举属性,例如 String 的 indexOf() 方法或 Object的toString()方法。
循环将遍历对象本身的所有可枚举属性,以及对象从其构造函数原型中继承的属性。
for in 可以遍历到myObject的原型方法(Object.prototype.method)
function ColoredTriangle() {
this.color = 'red';
}
var triangle = {a: 1, b: 2, c: 3};
ColoredTriangle.prototype = triangle;
var obj = new ColoredTriangle();
for (var prop in obj) {
console.log(`obj.${prop} = ${obj[prop]}`);
}
// obj.color = red
// obj.a = 1
// obj.b = 2
// obj.c = 3
hasOwnPropery方法可以判断某属性是否是该对象的实例属性
function ColoredTriangle() {
this.color = 'red';
}
var triangle = {a: 1, b: 2, c: 3};
ColoredTriangle.prototype = triangle;
var obj = new ColoredTriangle();
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
console.log(`obj.${prop} = ${obj[prop]}`);
}
}
// obj.color = red
ES5的Object.keys(myObject)获取对象的实例属性组成的数组,不包括原型方法和属性
function ColoredTriangle() {
this.color = 'red';
}
var triangle = {a: 1, b: 2, c: 3};
ColoredTriangle.prototype = triangle;
var obj = new ColoredTriangle();
console.log(Object.keys(obj))
// ["color"]
for in遍历数组的毛病
1.index索引为字符串型数字,不能直接进行几何运算
2.遍历顺序有可能不是按照实际数组的内部顺序
3.使用for in会遍历数组所有的可枚举属性,包括原型
所以for in更适合遍历对象,不要使用for in遍历数组
for of遍历的只是数组内的元素,而不包括数组的原型属性method和索引name
Array.prototype.method=function(){
console.log(this.length);
}
var myArray=[1,2,4,5,6,7]
myArray.name="数组"
for (var index in myArray) {
console.log(index);
}
// '1', '2', '4', '5', '6', '7', 'name', 'method'
Array.prototype.method=function(){
console.log(this.length);
}
var myArray=[1,2,4,5,6,7]
myArray.name="数组";
for (var value of myArray) {
console.log(value);
}
// 1,2,4,5,6,7
for of与forEach()不同,它可以正确响应break、continue和return语句
浙公网安备 33010602011771号