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语句

posted on 2019-08-01 17:54  bingery  阅读(145)  评论(0)    收藏  举报

导航