js for of 沒法改變數組變量

今天寫個函數時想遍歷數組,想一想沒怎麼用過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的可迭代協議

如下是MDN的可迭代協議:
「可迭代協議容許 JavaScript 對象去定義或定製它們的迭代行爲, 例如(定義)在一個 for..of 結構中什麼值能夠被循環(獲得)。一些內置類型都是內置的可迭代對象而且有默認的迭代行爲, 好比 Array or Map, 另外一些類型則不是 (好比Object) 。」
這裏咱們注意到Array和MapObject的迭代行爲是不同的對象

第二,看看對象被迭代的本質

另外一段材料:
「當一個對象須要被迭代的時候(好比開始用於一個for..of循環中),它的@@iterator方法被調用而且無參數,而後返回一個用於在迭代中得到值的迭代器。」
重點在於「返回一個用於在迭代中得到值的迭代器。」
這裏咱們能夠看到for of 的本質是返回一個迭代器ip

第三,迭代器是如何得到值的?

迭代器經過next()方法返回值,而不是指向地址,因此在for of 迭代中沒法改變數組元素get

參考材料:https://developer.mozilla.org...it

相關文章
相關標籤/搜索