for in和for of對比

不同點:
時間點不同:for in 在js出現之初就有,for of出現在ES6之后
遍歷的內容不同:for in用于遍歷對象的可枚舉屬性(包括原型鏈上的可枚舉屬性),for of用于遍歷可迭代對象的值

看個例子

// for in
const arr = ['a','b','c','d']
for(const index in arr) {console.log(index) 
}
// 打印結果:'0' '1' '2' '3',可以發現打印的是數組的下標,數組是特殊的對象,下標是數組對象身上的可枚舉屬性,打印的就是這個可枚舉屬性// for of
for(const item of arr) {console.log(item)
}
// 打印結果:'a' 'b' 'c' 'd',for of打印的就是數組里的每一項元素的值

可枚舉屬性
通過Object.getOwnPropertyDescriptor(obj, property),可以拿到屬性描述符

// 還是以數組為例,獲取數組的屬性'0'
console.log(Object.getOwnPropertyDescriptor(['a'],'0'))
/*** {*   configurable: true,*   enumerable: true,*   value: "a",*   writable: true* }*/
/* 可以看到返回了一個對象,這個對象就是屬性描述符,屬性描述符的屬性一般被稱為特性,可以看到,第二個特性enumerable就代表屬性是否可枚舉可枚舉的屬性就可以通過for in與Object.keys遍歷,數組身上有一個length屬性,但上面我們用for in 循環的時候并沒有打印length,說明length屬性是一個不可枚舉屬性,我們來看一下length屬性的屬性描述符:
*/
console.log(Object.getOwnPropertyDescriptor(['a'],'length'))
/*** {*   configurable: false,*   enumerable: false,*   value: 1,*   writable: true* }*/
// 可以看到數組身上的length屬性的屬性描述符里,enumerable為false,它是一個不可枚舉屬性,屬性描述符還有其他的特性,此處就不展開描述了,感興趣可以自行查閱

可迭代對象
實現了[Symbol.iterator]方法的對象,就被稱為可迭代對象
對象進行for…of循環時,會調用Symbol.iterator方法,返回該對象的默認遍歷器
ES6 規定,默認的 Iterator 接口部署在數據結構的Symbol.iterator屬性,或者說,一個數據結構只要具有Symbol.iterator屬性,就可以認為是“可遍歷的”(iterable)
鏈接: link

const obj = {[Symbol.iterator] : function () {return {next: function () {return {value: 1,done: true};}};}
};

上面的代碼中,對象obj是可遍歷的(iterable),因為具有Symbol.iterator屬性。執行這個屬性,會返回一個遍歷器對象。該對象的根本特征就是具有next方法。每次調用next方法,都會返回一個代表當前成員的信息對象,具有value和done兩個屬性
所以,對象只要實現了[Symbol.iterator]方法,就是可迭代的,即可使用for…of遍歷
原生具備 Iterator 接口的數據結構如下
Array
Map
Set
String
TypedArray
函數的 arguments 對象
NodeList 對象

案例:數組的Symbol.iterator屬性

let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();iter.next() // { value: 'a', done: false }
iter.next() // { value: 'b', done: false }
iter.next() // { value: 'c', done: false }
iter.next() // { value: undefined, done: true }

實現[Symbol.iterator]方法好麻煩,怎么這么復雜,于是有Generator 函數
Generator函數可以直接返回一個遍歷器對象
由于 Generator 函數就是遍歷器生成函數,因此可以把 Generator 賦值給對象的Symbol.iterator屬性,從而使得該對象具有 Iterator 接口

var myIterable = {};
myIterable[Symbol.iterator] = function* () {yield 1;yield 2;yield 3;
};[...myIterable] // [1, 2, 3]
for(const item of myIterable){console.log(item)} //1,2,3

上面代碼中,Generator 函數賦值給Symbol.iterator屬性,從而使得myIterable對象具有了 Iterator 接口,可以被…運算符和for…in遍歷了

async await,async await就是生成器函數的語法糖,配合promise,用生成器函數加yield也可以實現async await同樣的效果

參考:鏈接: link
鏈接: link

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43751.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43751.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43751.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux--線程的控制

目錄 0.前言 1.pthread庫 2.關于控制線程的接口 2.1.創建線程(pthread_create) 2.2.線程等待(pthread_join) 代碼示例1: ?編輯 ***一些問題*** 2. 3.創建多線程 3.線程的終止 (pthread_exit /…

給數組/對象添加一個(key-value)對象

需要將一個value值前面加上key值,放進數組/對象中 this.$set(res.data[0],type,1) this.$set( target, key, value ) target:要更改的數據源(可以是對象或者數組) key:要更改的具體數據 value :重新賦的值。 結果:…

文華財經盤立方多空變色波段趨勢線指標公式源碼

文華財經盤立方多空變色波段趨勢線指標公式源碼&#xff1a; N1:20; N2:ROUND(N1/2,1); N3:ROUND(SQRT(N1),1); N4:2*EMA2(C,N2)-EMA2(C,N1); 尊重市場:EMA2(N4,N3),COLORRED,LINETHICK2; 尊重市場1:IF(尊重市場<REF(尊重市場,1), 尊重市場,NULL),COLORGREEN,LINETHIC…

C++之List模擬實現

目錄 list的邏輯結構 構造函數 拷貝構造函數 賦值運算符重載 返回迭代器的初始位置 返回迭代器的最終位置 元素的插入 頭插 尾插 刪除元素 頭刪 尾刪 清空整個鏈表 析構函數 正向迭代器 反向迭代器 整體代碼 上期我們學寫了list的基本操作&#xff0c;本期我…

蘇東坡傳-讀書筆記十一

蘇東坡對寫作與風格所表示的意見最為清楚。他說做文章“大略如行云流水&#xff0c;初無定質&#xff0c;但常行于所當行&#xff0c;常止于所不可不止。文理自然&#xff0c;姿態橫生。孔子曰&#xff1a;‘言之不文&#xff0c;行而不遠。’又曰&#xff1a;‘辭達而已矣。’…

【cocos creator】2.4.x實現簡單3d功能,點擊選中,旋轉,材質修改,透明材質

demo下載:(待審核) https://download.csdn.net/download/K86338236/89527924 const {ccclass, property } = cc._decorator;const enum box_color {NORMAL = 0,DASHED_LINE = 1,//虛線TRANSLUCENT = 2,//半透明 }@ccclass export default class main extends cc.Component {…

STC32G/F/8H通用無刷電機驅動板

STC32G/F/8H通用無刷電機驅動板 &#x1f4cc;相關篇《低成本STC32G8K64驅動控制BLDC開源入門學習方案》 ?該驅動板是在上一版的基礎上改版而來。這里的STC32G/F/8H所指的是封裝型號為-LQFP48的STC32G8K64、STC32G12K128、STC32F12K54、STC8H8K64U。是一款兼容有感和無感設計的…

數據結構--樹和二叉樹的一些知識點總結

樹是n個結點的有限集&#xff0c;當n0時&#xff0c;稱為空樹。樹是一種遞歸的數據結構&#xff0c;樹作為一種邏輯結構同時也是一種分層的結構結點的深度是從根開始自頂向下累加&#xff1b;結點的高度是從葉結點自底向上累加由于樹中的分支是有向的&#xff0c;即從雙親指向孩…

【Java算法】二分查找 下

&#x1f525;個人主頁&#xff1a; 中草藥 &#x1f525;專欄&#xff1a;【算法工作坊】算法實戰揭秘 一.山脈數組的峰頂索引 題目鏈接&#xff1a;852.山脈數組的峰頂 ? 算法原理 這段代碼實現了一個查找山峰數組中峰值索引的算法。山峰數組是一個先遞增后遞減的數組&…

玩具營銷是如何拿捏成年人錢包?

好像現在的成年人逐漸熱衷于偏向年輕化&#xff0c;問問題會好奇“尊嘟假嘟”&#xff0c;飯量上的“兒童套餐”&#xff0c;娃娃機前排長隊......而最突出的莫過于各類各式的玩具不斷收割當代年輕人&#xff0c;除去常給大朋友們小朋友們送去玩具福利的“麥、肯”雙門&#xf…

激光干涉儀可以完成哪些測量:全面應用解析

在高端制造領域&#xff0c;精度是衡量產品質量的關鍵指標之一。激光干涉儀作為一項高精度測量技術&#xff0c;其應用廣泛&#xff0c;對于提升產品制造精度具有重要意義。 線性測量&#xff1a;精確定位的基礎 激光干涉儀采用邁克爾遜干涉原理&#xff0c;實現線性測量。該…

AlphaGo 的傳奇故事

文章目錄 一、說明二、AlphaGo 傳奇&#xff08;一&#xff09;&#xff1a;游戲規則三、AlphaGo 傳奇(二)&#xff1a;它是如何運作的&#xff1f;四、AlphaGo 傳奇&#xff08;三&#xff09;&#xff1a;史詩般的戰斗和人工智能的未來 一、說明 1997 年&#xff0c;IBM 的“…

卷積神經網絡之ResNet50遷移學習

數據準備 下載狗與狼分類數據集&#xff0c;數據來自ImageNet&#xff0c;每個分類有大約120張訓練圖像與30張驗證圖像。使用download接口下載數據集&#xff0c;并自動解壓到當前目錄。 全是小狗的圖片 另一邊全是狼的圖片 加載數據集 狼狗數據集提取自ImageNet分類數據集&a…

2-3個月的幼貓能吃主食凍干嗎?第一次吃哪款主食凍干比較好

2-3個月的幼貓能吃凍干嗎&#xff1f;一般來說&#xff0c;幼貓在2-3個月左右的離乳期就可以吃凍干了。需要注意的&#xff0c;一個是要認準主食凍干&#xff0c;零食凍干會讓貓貓從小就挑食&#xff0c;以后就更不好糾正了。而且離乳期的貓貓沒有了母乳的保護&#xff0c;免疫…

Open3D 點對面的ICP算法配準(精配準)

目錄 一、概述 1.1核心思想 1.2實現步驟 二、代碼實現 2.1關鍵函數 2.2完整代碼 三、實現效果 3.1原始點云 3.2配準后點云 3.3計算數據 一、概述 基于點對面的ICP&#xff08;Iterative Closest Point&#xff09;配準算法是ICP的一種變體&#xff0c;它通過最小化源…

【Ty CLI】一個開箱即用的前端腳手架

目錄 資源鏈接基礎命令模板創建命令幫助選擇模板開始創建開發模板 開發背景npm 發布流程問題記錄模板創建超時 更新日志 資源鏈接 文檔&#xff1a;https://ty.cli.vrteam.top/ 源碼&#xff1a;https://github.com/bosombaby/ty-cli 基礎命令 1. npm 全局安裝 npm i ty-cli…

Zabbix Sia Zabbix 邏輯漏洞(CVE-2022-23134)

前言 CVE-2022-23134是一個中等嚴重度的漏洞&#xff0c;影響Zabbix Web前端。這個漏洞允許未經身份驗證的用戶訪問setup.php文件的某些步驟&#xff0c;這些步驟通常只對超級管理員開放。利用這個漏洞&#xff0c;攻擊者可以通過跳過某些步驟來重新配置Zabbix前端&#xff0c…

gazebo仿真環境中加入livox mid360

https://github.com/Livox-SDK/livox_laser_simulation 功能包適用于ubuntu18.04 gazebo9的可以直接編譯運行。在ubutun20.04 的系統下gazebo是11版本,需要做一些修改 CMakeLists.txt文件中的 add_compile_options(-std=c++11) 改為 add_compile_options(-std=c++17)fatal er…

二一、搭建自已的語言大模型

1. 配置langchain環境 使用conda創建一個虛擬環境,基于 Python3.10,并在虛擬環境內安裝項目的依賴。注意,大模型對gpu有一定的要求,否則速度會奇慢無比。 conda create -n langchain python=3.10 conda env list conda activate langchain # 拉取倉庫 $ git clone ht…

Redis-Jedis連接池\RedisTemplate\StringRedisTemplate

Redis-Jedis連接池\RedisTemplate\StringRedisTemplate 1. Jedis連接池1.1 通過工具類1.1.1 連接池&#xff1a;JedisConnectionFactory&#xff1a;1.1.2 test&#xff1a;&#xff08;代碼其實只有連接池那里改變了&#xff09; 2. SpringDataRedis&#xff08;lettuce&#…