每一天一个知识点,积累少成多。
一for in遍历的特点 用它遍历数组
Array.prototype.methods=function(){
console.log(this.length);
}
var myArray=[1,2,4,5,6,7]
myArray.name="数组"
for (var index in myArray) {
console.log(myArray[index]);
}
1,index 为字符串型数字不能进行计算,
2.使用for in 会遍历数组上的所有的可枚举属性,包括原型列入上面添加在原型上的方法,和name属性。
所以for in 更适合遍历对象,不太适合遍历数组。
二 用for of 遍历数组
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);
}
总结for in 遍历数组是数组的索引(键名)for...of 遍历数组是数组的元素值。for of 遍历的只是数组内的元素,而不包括数组原型上的属性method,和索引name.
遍历对象
遍历对象通常用for in 来遍历对象的键名
Object.prototype.method=function(){
console.log(this);
}
var myObject={
a:1,
b:2,
c:3
}
for(var key in myObject){
console.log(key)
}
可以看出for in 遍历对象包含他原型的属性和方法。
for of 遍历对象报错,由此可知for of 不能遍历对象
怎么让for in 遍历不遍历出新增在该对象原型的属性和方法。就要用hasOwnProperty
Object.prototype.method=function(){
console.log(this);
}
var myObject={
a:1,
b:2,
c:3
}
for(var key in myObject){
if(myObject.hasOwnProperty(key)){
console.log(key)
}
}
总结
for..of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合.但是不能遍历对象,因为没有迭代器对象.与forEach()不同的是,它可以正确响应break、continue和return语句 for-of循环不支持普通对象,但如果你想迭代一个对象的属性,你可以用for-in循环(这也是它的本职工作)或内建的Object.keys()方法:
for (var key of Object.keys(someObject)) {
console.log(key + ": " + someObject[key]);
}
1 for of 遍历字符串
var str = "afdsf"
for (var key of str) {
// console.log(key)
}
2 for of 遍历map 结构和set 的结构 遍历map结构时可以用结构赋值
用结构赋值后
当你为对象添加myObject.toString()方法后,就可以将对象转化为字符串,同样地,当你向任意对象添加myObjectSymbol.iterator方法,就可以遍历这个对象了。所有拥有Symbol.iterator的对象被称为可迭代的。在接下来的文章中你会发现,可迭代对象的概念几乎贯穿于整门语言之中,不仅是for-of循环,还有Map和Set构造函数、解构赋值,以及新的展开操作符。
for of执行的步骤
for of 循环首先调集Symbol.iterator方法,紧接着返回一个新的迭代器对象,迭代器对象可以任意有.next的方法对象;for of循环将重复调用这个方法,每次循环调用一次,下面给特最简单的迭代器代码
var zeroesForeverIterator = {
[Symbol.iterator]: function () {
return this;
},
next: function () {
return {done: false, value: 0};
};