<script>
// for in 遍历数组/对象,会遍历原型上的 for of 只能遍历数组
Array.prototype.method = function () {
console.log(this.length);
}
var myArray = [1, 3, 5, 7, 9]
myArray.name = '数组'
for (var k in myArray) { //k 是数组下标
console.log(myArray[k]); //结果是 1 3 5 7 9 数组 f(){console.log(this.length)}
} //for in会遍历出数组原型上的方法和name 所以不适合遍历数组 适合遍历对象
console.log(myArray);
for (let key of myArray) {
console.log(key); //此时key 是 1 3 5 7 9
}
// 记住,for in遍历的是数组的索引(即键名),而for of遍历的是数组元素值。
// for of遍历的只是数组内的元素,而不包括数组的原型属性method和索引name
Object.prototype.add = function () {
console.log(this);
}
var myObject = {
a: 1, b: 2, c: 3
}
for (var k in myObject) {
console.log(k); //a b c add
console.log(myObject[k]); //此时输出 1 2 3 f(){console.log(this)}
console.log(myObject.k); //此时都是undefined
}
// for in 可以遍历到myObject的原型方法method
// 如果不想遍历原型方法和属性的话,可以在循环内部判断一下,hasOwnPropery方法可以判断某属性是否是该对象的实例属性
for (var key in myObject) {
if (myObject.hasOwnProperty(key)) {
console.log(key);
} //输出 a b c
}
console.log("===============================");
// for of不能直接遍历对象
// 同样可以通过ES5的Object.keys(myObject)获取对象的实例属性组成的数组,不包括原型方法和属性
// Object.keys(myObject)
// keys: 可以读取对象自身的属性名数组, 忽略原型中的
console.log('keys:', Object.keys(myObject)) //['a', 'b', 'c']
</script>