for...in以任意顺序遍历一个对象的可枚举属性。因此for-in不适合用来迭代一个Array。同时,for-in是能够遍历对象中全部可枚举属性的,包括原型链上的可枚举属性。javascript
let ret = []; array.num = 6; // 对象上直接添加属性 Array.prototype.num = 6; // 原型链中添加属性 for(let i in array){ ret.push(array[i]) } console.log(ret) // [ 1, 2, 3, 4, 5, 6, 7 ]
若是能够地设置属性为不可枚举,那么for-in循环将不会遍历到这个属性java
let ret = []; Object.defineProperty(array,"num",{ enumerable: false, // 设置属性不可遍历 value: 8 }) for(let i in array){ ret.push(array[i]) } console.log(ret) // [ 1, 2, 3, 4, 5 ]
解决方法:使用hasOwnProperty()
hasOwnProperty()方法能够检测一个属性是存在于实例中,仍是存在于原型中。这个方法只在给定属性存在于对象实例中时,才会返回true。 数组
/数组 var arr = ["星期一","星期二","星期三"]; Array.prototype.something = ["放假","休息咯"]; for (var i in arr){ if(arr.hasOwnProperty(i)){ console.log(arr[i]) } }
for(最原始的写法)、 支持 break、continue和return语句)、prototype
forEach 数组的方法,arr.forEach; forEach(ES5,可是它不支持使用break、continue和return语句)、code
for…in循环数组索引、对象的属性,但使用 for…in 原型链上的全部属性都将被访问,用 hasOwnProperty() 方法解决。对象
for…of(ES6,循环数组的元素值)这三个是循环数组(对象数组)的;
blog
ES5 只有两种声明变量的方法:索引
var
命令和function
命令。ip
ES6 除了添加let
和const
命令,原型链
还有 import
命令和class
命令。