1. 程式人生 > >[樂意黎原創]JS裡的for…in和for…of的用法與區別

[樂意黎原創]JS裡的for…in和for…of的用法與區別

for...in 迴圈

for...in 語句用於遍歷陣列或者物件的屬性(對陣列或者物件的屬性進行迴圈操作)。

for...in 語句用於對陣列或者物件的屬性進行迴圈操作。

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

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

for (variable in object) {...}
variable
在每次迭代時,將不同的屬性名分配給變數
object
被迭代列舉其屬性的物件。

for...in 迴圈只遍歷可列舉屬性。像 Array和 Object使用內建建構函式所建立的物件都會繼承自

Object.prototypeString.prototype的不可列舉屬性,例如 String 的 indexOf()  方法或 ObjecttoString()方法。迴圈將遍歷物件本身的所有可列舉屬性,以及物件從其建構函式原型中繼承的屬性(更接近原型鏈中物件的屬性覆蓋原型屬性)。

陣列索引只是具有整數名稱的列舉屬性,並且與通用物件屬性相同。不能保證for ... in將以任何特定的順序返回索引。for ... in迴圈語句將返回所有可列舉屬性,包括非整數型別的名稱和繼承的那些。

因為迭代的順序是依賴於執行環境的,所以陣列遍歷不一定按次序訪問元素。因此當迭代訪問順序很重要的陣列時,最好用整數索引去進行for

迴圈(或者使用 Array.prototype.forEach() 或 for...of 迴圈)。


語法:

for (變數 in 物件){    在此執行程式碼
}

“變數”用來指定變數,指定的變數可以是陣列元素,也可以是物件的屬性。


var mycars = new Array()
mycars[0] = "Saab"
mycars[1] = "Volvo"
mycars[2] = "BMW"

mycars.color = "white"

for (var x in mycars)
{
   console.log(mycars[x]);
}

var mycars = ["Saab", "Volvo", "BMW"];

mycars.color = "white"

for (var x in mycars)
{
   console.log(mycars[x]);
}


var mycars = {1:"Saab", 2:"Volvo", 3:"BMW"};

mycars.color = "white"

for (var x in mycars)
{
   console.log(mycars[x]);
}

var mycars = {"1":"Saab", "2":"Volvo", "3":"BMW"};

mycars.color = "white"

for (var x in mycars)
{
   console.log(mycars[x]);
}

for...of 迴圈

for … of迴圈是ES6引入的新的語法,用for … of迴圈遍歷集合

for...of語句可迭代物件(包括 ArrayMapSetStringTypedArrayarguments 物件等等)上建立一個迭代迴圈,呼叫自定義迭代鉤子,併為每個不同屬性的值執行語句。

for (variable of iterable) {
    //statements
}
variable在每次迭代中,將不同屬性的值分配給變數。iterable被迭代列舉其屬性的物件。
var mycars = new Array()
mycars[0] = "Saab"
mycars[1] = "Volvo"
mycars[2] = "BMW"

mycars.color = "white"

for (var x of mycars)
{
   console.log(x);
}

ar mycars = ["Saab", "Volvo", "BMW"];

mycars.color = "white"

for (var x of mycars)
{
   console.log(x);
}

var mycars = {1:"Saab", 2:"Volvo", 3:"BMW"};

mycars.color = "white"

for (var x of mycars)
{
   console.log(x);
}
//錯誤用法

for...offor...in的區別

無論是for...in還是for...of語句都是迭代一些東西。它們之間的主要區別在於它們的迭代方式。

for...in 語句以原始插入順序迭代物件的可列舉屬性

for...of 語句遍歷可迭代物件定義要迭代的資料。

以下示例顯示了與Array一起使用時,for...of迴圈和for...in迴圈之間的區別。

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

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

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

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

for (let i of iterable) {
  console.log(i); // logs 3, 5, 7
}
Object.prototype.objCustom = function() {};
Array.prototype.arrCustom = function() {}; 

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

每個物件將繼承objCustom屬性,並且作為Array的每個物件將繼承arrCustom屬性,因為將這些屬性新增到Object.prototypeArray.prototype。由於繼承和原型鏈,物件iterable繼承屬性objCustomarrCustom

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

此迴圈僅以原始插入順序記錄iterable 物件的可列舉屬性。它不記錄陣列元素357 或hello,因為這些不是列舉屬性。但是它記錄了陣列索引以及arrCustomobjCustom。如果你不知道為什麼這些屬性被迭代,array iteration and for...in中有更多解釋。

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

這個迴圈類似於第一個,但是它使用hasOwnProperty() 來檢查,如果找到的列舉屬性是物件自己的(不是繼承的)。如果是,該屬性被記錄。記錄的屬性是012foo,因為它們是自身的屬性(不是繼承的)。屬性arrCustomobjCustom不會被記錄,因為它們是繼承的

for (let i of iterable) {
  console.log(i); // logs 3, 5, 7 
}

該迴圈迭代並記錄iterable作為可迭代物件定義的迭代值,這些是陣列元素 357,而不是任何物件的屬性

For 迴圈

for 迴圈是您在希望建立迴圈時常會用到的工具。

下面是 for 迴圈的語法:

for (語句 1; 語句 2; 語句 3)
  {
  被執行的程式碼塊
  }

語句 1 在迴圈(程式碼塊)開始前執行

語句 2 定義執行迴圈(程式碼塊)的條件

語句 3 在迴圈(程式碼塊)已被執行之後執行

例項

for (var i=0; i<5; i++)
  {
  x=x + "The number is " + i + "<br>";
  }

總結

for … in迴圈由於歷史遺留問題,它遍歷的實際上是物件的屬性名稱。一個Array陣列實際上也是一個物件,它的每個元素的索引被視為一個屬性。 

for … in迴圈將把name包括在內,但Array的length屬性卻不包括在內。

for … of迴圈則完全修復了這些問題,它只迴圈集合本身的元素。


以上

-------------------------------

樂意黎

2018-05-07

相關推薦

[樂意原創]JSforinforof用法區別

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

[樂意原創] Centos下目錄許可權使用者名稱使用者組等操作命令詳解

1. Linux/Centos 許可權命令常識: Linux作業系統是多使用者多工作業系統,包括使用者賬戶和組賬戶兩種: 細分使用者賬戶(普通使用者賬戶,超級使用者賬戶)除了使用者賬戶以為還有組賬戶所謂組賬戶就是使用者賬戶的集合,centos組中有兩種型別,私有組和標準組:

js遍歷物件、遍歷陣列、js陣列方法大全、區分map()forEach()以及filter()、區分for...in...for...of...

1、給物件新增屬性:使用 object.prop 或object['prop']  給物件新增屬性 let obj={}; obj.name="zhangsan"; obj["age"]=23; obj["class"]="語文"; console.log(obj

[樂意原創] JS根據useAgent來判斷edge, ie, firefox, chrome, opera, safari 等瀏覽器的型別及版本

JS根據瀏覽器的useAgent來判斷瀏覽器的型別。userAgent 屬性是一個只讀的字串,聲明瞭瀏覽器用於 HTTP 請求的使用者代理頭的值。javascript語法:navigator.userAgentPHP語法:$_SERVER['HTTP_USER_AGENT']

關於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,forEachMap

循環對象 共同點 school 遍歷 fine 不能 name pre 包括 for-in和for-of   1.  for-in循環實際是為循環”enumerable“對象而設計的,是用來循環帶有字符串key的對象的。    使用for in會遍歷數組所有的可枚舉屬性,包

for..in for...of區別

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

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

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

for in for of區別

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

for in for of區別詳解

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

forEach、for...infor..of比較

forEach是遍歷陣列中的值: var arr=['one','two','three']; arr.forEach(function(value){ console.log(value); }) //one //two //three 這種寫法的問題在於,無法中途跳出forE

forfor infor of

Array、Object、Set、Map四種資料結構中for、for in和for of迴圈的區別? 一、普通for迴圈在Array和Object中都可以使用。 二、for in在Array和Object中都可以使用。 注意:在物件中包含原型上的屬性

Javascript 中 的 for ... in for ... of 差別

Javascript 中 的 for ... in 和 for ... of 差別 for ... in 是歷史問題,在迴圈資料時會可以出現奇怪的問題,比如把資料的屬性迴圈出來。 for ... of 是 ES6 解決歷史問題而出的。 以下程式碼可以看出區別 <script>

for-in for-of區別

1. for-in迴圈 for-in迴圈主要用於遍歷物件,for()中的格式:for(keys in zhangsan){} keys表示obj物件的每一個鍵值對的鍵!!所有迴圈中,需要使用obj[keys]來取到每一個值!!!for-in 迴圈,遍歷時不僅

[每日一題]面試官問:for infor of區別原理?

關注「鬆寶寫程式碼」,精選好文,每日一題 ​時間永遠是自己的 每分每秒也都是為自己的將來鋪墊和增值 >作者:saucxs | songEagle ## 一、前言 2020.12.23 日剛立的 flag,每日一題,題目型別不限制,可以是:演算法題,面試題,闡述題等等。 本文是「每日一題」第 7

淺談mmap()ioremap()的用法區別

12只 設備 gpa 我們 之間 mmap ioremap shared set 一、mmap()mmap()函數是用來將設備內存線性地址映射到用戶地址空間。(1)首先映射基地址,再通過偏移地址尋址;(2)unsigned char *map_cru_base=(unsig

oracle 之 偽列 rownum rowid的用法區別

lena select 區別 name 繼續 class 重復 clas 重復數據 rownum的用法 select rownum,empno,ename,job from emp where rownum<6 可以得到小於6的值數據 select rownum,e

【轉】typedef#define的用法區別

++ 說明 運算符 lan body 精度 標識 gpo 幫助 typedef和#define的用法與區別 一、typedef的用法   在C/C++語言中,typedef常用來定義一個標識符及關鍵字的別名,它是語言編譯過程的一部分,但它並不實際分配內存空間,實例像:

marginpadding的用法區別--以及bug處理方式

使用 滿足 左右 ron 相互 一段 布局 方式 ont margin和padding的用法: (1)padding (margin) -left:10px;          左內 (外) 邊距(2)padding (margin) -right:10px;       

ajaxForm() ajaxSubmit() 的用法區別

一、Query.form.js 介紹 Query.form.js 是一個 form 外掛,可以實現表單提交併在當前頁面中處理返回值,即 html 中提交表單並實現不跳轉頁面處理返回值。 二、下載地址 http://malsup.github.io/jquery.form.js