1. 程式人生 > >for in 與for of迴圈的區別

for in 與for of迴圈的區別

最近看了一篇google的js編碼規範,在ES6中,有3種不同的for迴圈。儘管每一種有它的應用場景,但Google仍推薦使用for…of。不過我喜歡使用for…in遍歷Object,使用for…of遍歷陣列。for…of是ES6新引入的特性。修復了ES5引入的for…in的不足。儘管這種使用方式與google的規範相沖突,但我就喜歡這種各司其職的使用方式,讓我們來對for…in和for…of做一個分析,對比分析過後,喜歡用那種方式就那種方式,都不影響的。無論是for…in還是for…of語句都是迭代一些東西。它們之間的主要區別在於它們的迭代方式。for…in 語句以原始插入順序迭代物件的可列舉屬性(只能迭代出可列舉的屬性,至於什麼叫做可列舉屬性/不可列舉屬性,請baidu/google)。for…of 語句遍歷可迭代物件定義要迭代的資料(非自定義屬性)。下面我們來看一下:

如果我們要遍歷一個數組的value值,我們定義這個陣列:

 let arr = ['a','b','c'];

我們先使用for in 迴圈:

for(let index in arr ){
    console.log(`${arr[index]}`);//a,b,c
}

在使用for of 迴圈

for(var value of arr){
    console.log(value);//a,b,c
}

看上去好像只有寫法不一樣而已,但是為什麼說for of 補充了for in 的缺陷呢,我們往陣列arr裡新增一個hobby屬性。

arr.hobby = 'foosball';

現在我們再使用這兩種方式對陣列進行遍歷輸出:

for(let index in arr){
    console.log(`${arr[index]}`); //a,b,c,'foosball'
}
for(var value of arr){
    console.log(value);//a,b,c
}

這裡就很明顯了。for…of不能迴圈出自定義的屬性。我們再換一種方式,程式碼如下:

Object.prototype.objCustom = function() {}; 
Array.prototype.arrCustom = function() {};
arr.hobby = 'foosball'
; for (let i in arr) { console.log(i); // 0, 1, 2, "hobby", "arrCustom", "objCustom" } for (let i in iterable) { if (iterable.hasOwnProperty(i)) { console.log(i); //0, 1, 2, "hobby" } } for (let i of iterable) { console.log(i); // 'a', 'b', 'c' }

將objCustom屬性和arrCustom屬性新增到Object.prototype和Array.prototype。由於繼承和原型鏈,物件arr繼承屬性objCustom和arrCustom。使用hasOwnProperty() 來檢查,證明屬性arrCustom和objCustom是繼承的。由此可見,for…of迴圈的是的是可迭代物件的value(值),in迴圈的是可迭代物件的key(屬性),for…of迴圈不能迴圈普通的物件,對普通物件的屬性遍歷推薦使用for…in。
但是非要使用for…of來迴圈物件,並不是不可以。此時就要結合Object.keys()進行使用:

for(var key of Object.keys(arr)){
    //使用Object.keys()方法獲取物件key的陣列
    console.log(arr[key]);
}

相關推薦

for in for of迴圈區別

最近看了一篇google的js編碼規範,在ES6中,有3種不同的for迴圈。儘管每一種有它的應用場景,但Google仍推薦使用for…of。不過我喜歡使用for…in遍歷Object,使用for…of遍歷陣列。for…of是ES6新引入的特性。修復了ES5引入的

for for infor of區別

我們一般用for迴圈來遍歷陣列,因它可以按順序的返回每一個索引的值或者索引 ,for迴圈並不能遍歷物件。 for in 用來遍歷物件及其原型鏈上的可列舉屬性,而且它的遍歷結果不一定是按照順序來的。 就比如說 如果陣列長度中存在空值或者undefined ,那麼for in 會直接忽略它,迭代下一個屬性。並

JS中 for in for of區別

最直接的區別就是: for in遍歷的是陣列的索引(即鍵名), 而for of遍歷的是陣列元素值。 Array.prototype.method=function(){} var myArray=[1,2,4]; myArray.name="陣列"; for (var

for...infor...of區別

for...in 1.遍歷物件的可列舉屬性(屬性描述符enumerable為true的屬性,通過Object.defineProperty(obj,prop,descriptor)修改,通過obj.p

簡述js中 for in for of 區別

for in是ES5標準,遍歷key. for of是ES6標準,遍歷value. for (var key in arr){ console.log(arr[key]); } for

for each in for in for of

for each in   for each in是作為E4X標準的一部分在javascript 1.6中釋出的,而它不是ECMAScript標準的一部分。  這將意味著存在各種瀏覽器的相容性問題。for each in,對很多瀏覽器都不支援的。例如是不支援IE6,IE7

淺談for...infor....of

     for...in:       for...in語句以任意順序遍歷一個物件的可列舉屬性。對於每個不同的屬性,語句都會被執行。       語法: for (variable in object)

for each in for infor of

搜索 scrip cti nta iterator for 找到 可選 value 1.for each in 語法: for each (variable in object) { statement }參數: variable用來遍歷屬性值的變量,前面的var關鍵字

for infor of

var arr=[5,6,7,8] var obj={name:'wang',age:11,sex:'man'}; for(var y of arr){ console.log(y);

for、forEach 、for infor of 迴圈區別

很基礎的東西,記錄下來方便自己 for:遍歷陣列 //物件陣列 var arr = [ {Monday: '星期一', Monday: '星期二', Wednesday: '星期三'} ] for (var i=0; i<arr.length;i+

[樂意黎原創]JS裡的forinforof的用法區別

for...in 迴圈for...in 語句用於遍歷陣列或者物件的屬性(對陣列或者物件的屬性進行迴圈操作)。for...in 語句用於對陣列或者物件的屬性進行迴圈操作。for ... in 迴圈中的程式碼每執行一次,就會對陣列的元素或者物件的屬性進行一次操作。for...in

關於JSON類的兩個用途for..infor循環的區別

進行 length 區別 prop per str 字符 number stringify JSON 這個類的兩個用途: 1)將Object 對象,轉換成string 類型 var obj = {"a":"1","b":"2","c":"json"}; var

for..infor...of區別

ttr display ... isp 定義 執行 可叠代對象 ring ole for...of 是ES6出現的 循環遍歷的是值 語句在可叠代對象(包括 Array, Map, Set, String, TypedArray,arguments 對象等等)上創建一個叠代循

for in Object.keys hasOwnProperty區別

har 補充 back es2017 https prot git type 限制 1、結論 for in遍歷對象所有可枚舉屬性 包括原型鏈上的屬性 Object.keys遍歷對象所有可枚舉屬性 不包括原型鏈上的屬性 hasOwnProperty 檢查對象是否包含屬性

Python之for in while 在循環內賦值的區別

固定 print range 如果 的區別 但是 while eve 變化 1 level = 3 2 for each_item in range(level): 3 level += 1 4 print(233) 輸出效果如下: 1 233 2 2

五分鐘掌握 for...infor...of 區別

GitHub 地址,歡迎star,檢視更多整理的前端知識 for...in for...in 語句以任意順序遍歷一個物件的可列舉屬性。 for...in 遍歷物件本身的所有可列舉屬性,以及物件從其建構函式原型中繼承的屬性。 for (variable in object) {...} var

for...infor...of、forEach、map的區別

for…in for…in以原始插入順序訪問物件的可列舉屬性,包括從原型繼承而來的可列舉屬性。 let obj = { a:123, b:"abc" } for(let pro in obj){ console.log(pro+':' + obj[pro]

for infor of區別

最近突然發現雖然整天做專案,但是基礎的東西忘得越來越多了,所以我準備沒事就回顧回顧基礎知識,今天來回顧一下for in 和for of的區別   首先來看for in    for in 可以用來遍歷陣列,但是會有以下幾個問題   1.index索引為字串型數字,不能直接進行幾何運

for infor of區別詳解

for in 和 for of 相對於大家肯定都不陌生,都是用來遍歷屬性的沒錯。那麼先看下面的一個例子: 例1 const obj = { a: 1, b: 2, c: 3 } for (let i in obj) {

for迴圈(for,for in,forEach,for of)一較高下~

想先說幾句,我編輯即將完成的文章,因為不小心按錯了滑鼠鍵,就一切完犢子了。 都2018年了,網際網路世界依然會發生這種痛心疾首的小事情,我不知道該和CSDN說點什麼……。 ----------------------------------回到正文------------