對象解構與迭代器的貓膩?

前言

變量的解構賦值是前端開發中經常用到的一個技巧,比如:

// 對象解構
const obj = { a: 1, b: 2 };
const { a, b } = obj;
console.log(a, b)數組解構
const arr = [1, 2, 3];
const [a, b] = arr;
console.log(a, b)

工作中我們最經常用的就是類似上面的對象和數組解構,好多同學就不禁問了,這個不是很簡單嗎。
那好,我們再來看一個:

// 不改動下面代碼,如何使等式成立
const [a, b] = { a: 1, b: 2 };
console.log(a, b)

你覺得這個打印出來什么呢?
在這里插入圖片描述

直接報錯:{(intermediate value)(intermediate value)} is not iterable
翻譯過來就是值是不可迭代的,這是為什么呢?因為右邊的值是不可迭代對象

可迭代對象

什么是可迭代對象?
可迭代對象就是滿足 可迭代協議 的對象。
可迭代協議 中必須有這么一個屬性:Symbol.iterator,一個無參數的函數,其返回值為一個符合 可迭代協議 的對象,即迭代器。

數組解構

數組可以解構,因為數組是一個可迭代對象。

const arr = [1, 2, 3];
const iter = arr[Symbol.iterator]();
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())

我們看一下打印結果:
在這里插入圖片描述

value代表的是這次迭代的值,done代表迭代是否完成。
這就是 可迭代協議 的規則。
數組解構就相當于下面這種寫法:

const arr = [1, 2, 3];
// const [a,b] = arr;
const iter = arr[Symbol.iterator]();
const a = iter.next().value;
const b = iter.next().value;
console.log(a, b)

對象解構

那么問題來了,對象身上沒有 Symbol.iterator,為什么還能解構?
因為對象的解構過程是這樣的:創建對象 -> 枚舉屬性(OwnPropertyKeys) -> 復制屬性,跟迭代器沒關系。
對象解構就相當于下面這種寫法:

const obj = { a: 1, b: 2 };
// const { a, b } = obj;
const a = obj.a;
const b = obj.b;

問題解決

我們捋清楚問題的起因,問題就好解決了,我們只需要在對象的原型上也添加一個 Symbol.iterator 屬性就可以了:

Object.prototype[Symbol.iterator] = function () {return Object.values(this)[Symbol.iterator]();
}
const [a, b] = { a: 1, b: 2 };
console.log(a, b)

這樣就能使等式成立,而且如果你的 ES6 功底足夠的扎實,還知道什么叫 生成器Generator,那你還可以這樣寫:

Object.prototype[Symbol.iterator] = function* () {yield* Object.values(this);
}
const [a, b] = { a: 1, b: 2 };
console.log(a, b)

最終效果是一樣的。

如果你對這些還不是很熟悉,建議你看一下 ES6 的文檔:ECMAScript 6 入門教程

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

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

相關文章

輕松拿捏C語言——自定義類型之【結構體】

🥰歡迎關注 輕松拿捏C語言系列,來和 小哇 一起進步!? 🎉創作不易,請多多支持🎉 🌈感謝大家的閱讀、點贊、收藏和關注💕 🌹如有問題,歡迎指正 1. 結構體類型的…

echarts-象形柱圖

象形柱圖 一般的柱圖都是純色柱圖,使用象形柱圖可以給柱圖定義自己的樣式。 樣式的調節與柱圖一樣,核心在于symbol調節柱圖的組成。 let options {tooltip: {},xAxis: {type: "category",data: ["d1", "d2", "d3&qu…

具有固定寬度的盒子:\makebox, \parbox

makebox \makebox 是 LaTeX 中的一個命令&#xff0c;用于創建一個具有固定寬度的盒子&#xff0c;并在該盒子內放置內容。這個命令可以用于控制文本或對象的位置和對齊。 語法如下&#xff1a; \makebox[<width>][<alignment>]{<content>}其中&#xff1…

存儲+調優:存儲-memcached

存儲調優&#xff1a;存儲-memcached 什么是memcached? 高性能的分布式內存緩存服務器。通過緩存數據庫的查詢結果&#xff0c;減少數據庫訪問次數&#xff0c;以提高動態Web應用的速度、提高可擴展性。 在memcached中存什么&#xff1f; 盡快被保存 訪問頻率高 1.數據保…

【CSharp】int類型與IntPtr類型之間的轉換

【CSharp】int類型與IntPtr類型之間的轉換 1.背景2.int轉IntPtr接口3.IntPtr轉int接口4.相互轉化示例1.背景 .NET提供了一個結構體System.IntPtr專門用來代表句柄或指針。 IntPtr 結構,表示一個帶符號整數,其中位寬度與指針相同。 注解 類型 IntPtr 設計為一個整數,其大小…

unity回到低版本報錯解決

用高版本2022打開過后的再回到2020就報了一個錯。 報錯如下&#xff1a; Library\PackageCache\com.unity.ai.navigation1.1.5\Runtime\NavMeshSurface.cs 看了一下是Library&#xff0c;然后我刪除了整個Library文件夾&#xff0c;重啟啟動生成Library&#xff0c;然后還是…

IT人的拖延——渴望成功與害怕成功的矛盾

很多人都以為&#xff0c;害怕失敗是拖延的主要誘因&#xff0c;但其實“害怕成功”也是拖延的主要誘因之一。要說這個原因&#xff0c;我們不得不提起Bible中的一個人“約拿”&#xff0c;讓我們先來看看他的故事帶給我們什么啟示。 約拿情結簡介 約拿是Bible中的一名先知&a…

二十九、openlayers官網示例DeclutterGroup解析——避免矢量圖層的文字重疊

官網demo地址&#xff1a; Declutter Group 這篇說的是如何設置矢量圖層上多數據點文字不重疊。 主要是屬性declutter &#xff0c;用于處理矢量圖層上重疊的標注和符號&#xff0c;為true時啟用去重疊功能。所有矢量特征的標注和符號都會被處理以避免重疊。false則與之相反。…

Nuxt - middleware 路由中間件

官方文檔&#xff1a;https://nuxt.com.cn/docs/guide/directory-structure/middleware 目錄 1 中間件類別2 中間件執行順序3 內聯路由中間件4 命名路由中間件5 全局路由中間件 1 中間件類別 內聯路由中間件&#xff0c;直接在頁面內定義。命名路由中間件&#xff0c;放置在 …

es安裝錯誤Exception in thread “main“ java.nio.file.NoSuchFileException解決方案

docker 啟動es出現一下錯誤的解決方案 Exception in thread “main” java.nio.file.NoSuchFileException: /usr/share/elasticsearch/config/jvm.options Exception in thread "main" java.nio.file.NoSuchFileException: /usr/share/elasticsearch/config/jvm.op…

香橙派OrangePi AIpro,助力國產AIoT邁向新的臺階!

前言&#xff1a;很高興受邀CSDN與OrangePi官方組織的測評活動&#xff0c;本次測評是一塊基于AI邊緣計算的香橙派開發板OrangePi AIpro。這是 香橙派 聯合 華為昇騰 合作精心打造的新一代邊緣AI計算產品&#xff0c;于2023年12月初發布&#xff0c;提供 8/20TOPS澎湃算力[1]&a…

Java | Leetcode Java題解之第102題二叉樹的層序遍歷

題目&#xff1a; 題解&#xff1a; class Solution {public List<List<Integer>> levelOrder(TreeNode root) {Queue<TreeNode> queue new LinkedList<>();List<List<Integer>> res new ArrayList<>();if (root ! null) queue.a…

Bean的一些屬性信息總結

我們知道&#xff0c;在Spring中&#xff0c;一個Bean可以理解為一個對象&#xff0c;但是二者之間肯定是有區別的&#xff0c;比如一個Bean可以實例化成很多個對象、Bean中可以帶有某些描述信息。 學習Bean&#xff0c;能更好地使用Bean。 1、Spring兩個核心概念的由來【可忽…

Git和plink

安裝git的話首先進入到git官網進行下載Git - Downloading Package (git-scm.com) &#xff0c;點擊便會自動進行下載。 安裝plink時也是根據自己電腦的版本號選擇進行安裝&#xff0c;我的是windows的64位&#xff0c;由此選擇以上版本進行安裝&#xff0c;這一個下載完成之后不…

python lxml安裝失敗怎么解決

通過pip install lxml 安裝lxml多次失敗&#xff0c;失敗原因總結如下&#xff1a; 1、pip版本未更新 解決方法&#xff1a;通過pip安裝時&#xff0c;需保證pip的版本沒有問題。 更新方法&#xff1a;在系統框輸入&#xff1a;python -m pip install --upgrade pip 2、下載…

oracle 還原被覆蓋的視圖

1.現在的視圖 select to_lob(text) from SYS.DBA_views where view_nameXXX; 2.查舊數據 --as of timestamp to_date(2024-05-28 10:30:00,yyyy-mm-dd hh24:mi:ss) select to_lob(text) from SYS.DBA_views as of timestamp to_date(2024-05-28 10:30:00,yyyy-mm-dd hh24:mi:s…

好消息!DolphinScheduler官網集成LLM模型問答AI kapa.ai

不少小伙伴可能發現了&#xff0c;Apache DolphinScheduler官網最近默默上線了kapa.ai作為LLM的問答AI。 集成kapa.ai之后&#xff0c;社區用戶可以點擊Apache DolphinScheduler官網首頁右下角的「Ask AI」模塊&#xff0c;在接下來彈出的問答框輸入自己的問題&#xff0c;即可…

python uiautomator2 常用操作

uiautomator2 安裝 python uiautomator2 安裝及使用-CSDN博客 一&#xff0c; 通過包名可以打開app d.app_start(com.gacne.www) 打開app運行后執行代碼&#xff0c;查看app具體信息獲取包名 d.info二&#xff0c;執行等待點擊 # 160秒內等待xpath定位的出現執行點擊 d.xpat…

mysql中單表查詢的成本

大家好。我們知道MySQL在執行一個查詢時&#xff0c;經常會有多個執行方案&#xff0c;然后從中選取成本最低或者說代價最低的方案去真正的執行查詢。今天我們來聊一聊單表查詢的成本。 那么到底什么是成本呢&#xff1f;這里我們說的成本或者代價是由兩方面組成的&#xff1a…

【踩坑】編譯opencv將python (for build) python2.7改為python3

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你&#xff0c;歡迎[點贊、收藏、關注]哦~ 出現問題 默認是2.7 解決方案 cmake時候添加&#xff1a; -D PYTHON_DEFAULT_EXECUTABLE$(which python3)