五分鐘掌握 for...in 和 for...of 區別

GitHub 地址,歡迎star,查看更多整理的前端知識前端

for...in

for...in 語句以任意順序遍歷一個對象的可枚舉屬性。
for...in 遍歷對象自己的全部可枚舉屬性,以及對象從其構造函數原型中繼承的屬性。git

for (variable in object) {...}
  • variable 在每次迭代時,將不一樣的屬性名分配給變量。
  • object 被迭代枚舉其屬性的對象。

只遍歷自身的可枚舉屬性,能夠使用 hasOwnPropertygithub

for (var prop in obj) {
  if (obj.hasOwnProperty(prop)) {
    console.log(`obj.${prop} = ${obj[prop]}`);
  } 
}

for...of

for...of 語句在可迭代對象(包括 Array,Map,Set,String,TypedArray,arguments 對象等等)上建立一個迭代循環,調用自定義迭代鉤子,併爲每一個不一樣屬性的值執行語句。
對於for...of的循環,能夠由break, throw 或return終止(使用return報錯?)。frontend

for (variable of iterable) {
    //statements
}
  • variable 在每次迭代中,將不一樣屬性的值分配給變量。
  • iterable 被迭代枚舉其屬性的對象。
let iterable = [10, 20, 30];

for (const value of iterable) {
  console.log(value);
}
// 10
// 20
// 30

for...of 與 for...in 區別

  • for...in 語句以原始插入順序迭代對象的可枚舉屬性。
  • for...of 語句遍歷可迭代對象定義要迭代的數據。

區別示例:函數

Object.prototype.objCustom = function() {}; 
Array.prototype.arrCustom = function() {};

let iterable = [3, 5, 7];
iterable.foo = 'hello';

for (let i in iterable) {
  console.log(i); // 0, 1, 2, "foo", "arrCustom", "objCustom"
}

for (let i in iterable) {
  if (iterable.hasOwnProperty(i)) {
    console.log(i); // 0, 1, 2, "foo"
  }
}

for (let i of iterable) {
  console.log(i); // 3, 5, 7
}
相關文章
相關標籤/搜索