按照各方法的定义,以下迭代方法应该都能对数组中的每一项运行传入函数,但是:
//对数组进行迭代
//for方法
let b=[1,2,3]
for(let i=0,len=b.length;i<len;i++){
b[i]*=2
}
console.log(b) //[2,4,6]
//forEach方法
...
b.forEach(function(i,j){
b[j]*=2
})
...//[2,4,6]
//for in方法
...
let c=Object.keys(b)
for(let i in c){
b[i]*=2
}
...//[2,4,6]
//for of方法
...
for(let i of b){
i*=2
}
...//[1,2,3]
可以看到for of
不会修改原数组并返回,参考诸多文档发现都只提到遍历添加事件,目前只能在for of
上使用额外方法才能实现数组遍历修改.最后希望各位答主能给出实现原理角度的提示分析,谢谢!
楼主在我的疑惑文章里没有回复我的评论我就来这里强答一波吧哈哈
以下是
个人推断,有错误请指出
第一,先看看MDN的可迭代协议
以下是MDN的可迭代协议:
“可迭代协议允许 JavaScript 对象去定义或定制它们的迭代行为, 例如(定义)在一个 for..of 结构中什么值可以被循环(得到)。一些内置类型都是内置的可迭代对象并且有默认的迭代行为, 比如 Array or Map, 另一些类型则不是 (比如Object) 。”
这里我们注意到
Array和Map
与Object
的迭代行为是不一样的第二,看看对象被迭代的本质
另一段材料:
“当一个对象需要被迭代的时候(比如开始用于一个for..of循环中),它的@@iterator方法被调用并且无参数,然后返回一个用于在迭代中获得值的迭代器。”
重点在于
“返回一个用于在迭代中获得值的迭代器。”
这里我们可以看到for of 的
本质是返回一个迭代器
第三,迭代器是如何获得值的?
迭代器通过next()方法
返回值
,而不是指向地址
,所以在for of 迭代中无法改变数组元素参考材料:https://developer.mozilla.org...