今天写个函数时想遍历数组,想一想没怎么用过for...of...
这类的语法,因而作了个尝试,竟发现for...of...没法改变数组元素。
javascript
贴代码,上例子java
let array = [1,2,3]; for(let num of array){ num++; console.log(num); } console.log(array); //输出以下 //2 //3 //4 //[1,2,3]
这是为何呢,暂时找不到答案
那么for...in...会不会呢?
数组
因而又试试for...in...
语法
代码以下函数
let obj = { std1 : "Bob", std2 : "Mike" } for(let name in obj){ obj[name] = 'Lily'; console.log(obj[name]); } console.log(obj); //显示以下 //"Lily" //"Lily" //{std1:"Lily", std2:"Lily"}
。。。。。
留个坑,之后看能不能找到为何。
后来找出解释,不知是否正确,以下:
如下是我的推断,有错误请指出
code
如下是MDN的可迭代协议:“可迭代协议容许 JavaScript 对象去定义或定制它们的迭代行为, 例如(定义)在一个 for..of 结构中什么值能够被循环(获得)。一些内置类型都是内置的可迭代对象而且有默认的迭代行为, 好比 Array or Map, 另外一些类型则不是 (好比Object) 。”
这里咱们注意到Array和Map
与Object
的迭代行为是不同的对象
另外一段材料:“当一个对象须要被迭代的时候(好比开始用于一个for..of循环中),它的@@iterator方法被调用而且无参数,而后返回一个用于在迭代中得到值的迭代器。”
重点在于“返回一个用于在迭代中得到值的迭代器。”
这里咱们能够看到for of 的本质是返回一个迭代器
ip
迭代器经过next()方法返回值
,而不是指向地址
,因此在for of 迭代中没法改变数组元素get