05-ES6

數據解構

Set

ES6 提供了新的數據結構 Set。它類似于數組,但是成員的值都是唯一的,沒有重復的值

Set 本身是一個構造函數,用來生成 Set 數據結構

  //set集合,成員是唯一的,添加過程中會替換相同的元素。這里相同的標準是===const s = new Set();s.add(1);s.add("2");s.add(3);s.add(4).add(5);console.log(s); //{ 1, '2', 3, 4, 5 }/***************==和===的區別****************************** */var a = 1;var b = "1";console.log(a == b); //true,只比較值,不比較類型console.log(a === b); //false,值和類型都比較//set類型的刪除,返回的是一個bool值s.delete(1);console.log(s);//清除所有的成員s.clear();//判斷是否存在s.has(2);//獲取成員數量s.size();//與數組結構類型轉換const set = new Set([1, 2, 3, 4, 5, 6]); //Array-->Setlet arr = Array.from(set); //Set-->Array//擴展運算符let arr2 = [...set];console.log(arr2);
  //并集、交集、差集const list1 = [1, 2, 3, 4, 5];const list2 = [2, 4, 5];var listall = list1.concat(list2);const set1 = new Set(listall);console.log([...set1]); //并集const set2 = [...new Set([...list1, ...list2])]; //并集var listjiao = list1.filter((v) => list2.includes(v));console.log(listjiao); //交集var listchaji = list1.filter((v) => !list2.includes(v));console.log(listchaji); //差集

Map

JavaScript 的對象(Object),本質上是鍵值對的集合,但是傳統上只能用字符串當作鍵。這給它的使 用帶來了很大的限制

ES6 提供了 Map 數據結構。它類似于對象,也是鍵值對的集合,但是“鍵”的范圍不限于字符串,各種類 型的值(包括對象)都可以當作鍵

  const m1 = new Map();m1.set("id", 1).set("name", "jack");//console.log(m1); //Map { 'id' => 1, 'name' => 'jack' }//定義其他類型,任何類型都可以作為鍵let arr = [1, 2, 3];m1.set(arr, 100);console.log(m1); //Map { 'id' => 1, 'name' => 'jack', [ 1, 2, 3 ] => 100 }//map長度console.log(m1.size);//通過鍵獲取數據console.log(m1.get("id"));//has(key) 返回一個布爾值,表示某個鍵是否在當前 Map 對象之中console.log(m1.has("id"));//delete(key) 刪除某個鍵,返回 true 。如果刪除失敗,返回 falseconsole.log(m1.delete("id"));//clear() 清除所有成員,沒有返回值m1.clear();//map的循環遍歷---使用for...of進行循環遍歷//另一種定義方式,二維數組const m2 = new Map([["a", 1],["b", 2],["c", 3],]);console.log(m2); //Map { 'a' => 1, 'b' => 2, 'c' => 3 }

for..of循環

for...of 循環可以使用的范圍包括數組、Set 和 Map 結構、某些類似數組的對象(比如 arguments 對 象、DOM NodeList 對象)、后文的 Generator 對象,以及字符串

能夠使用for...of循環的對象內部需要有Symbol方法

普通對象不能使用for...of進行循環

  const arr = ["red", "green", "gray"];for (let v of arr) {console.log(v); //輸出數組內的元素}const s = new Set(arr);for (let v of s) {console.log(v); //"red", "green", "gray"}for (let [i, v] of arr.entries()) {console.log(i); //索引console.log(v); //元素}const m1 = new Map();m1.set("id", 1).set("name", "jack");for (let v of m1) {console.log(v); //[ 'id', 1 ] [ 'name', 'jack' ]}//數組解構for (let [k, v] of m1) {console.log(k); //鍵console.log(v); //值}//普通對象使用for...ofvar o1 = { id: 1, name: "jack" };for (let v of o1) {console.log(v); //異常:TypeError: o1 is not iterable}//解決方法var o2 = { id: 1, name: "jack" };for (let v of Object.entries(o2)) {console.log(v); //數組結構,[ 'id', 1 ]}for (let [k, v] of Object.entries(o2)) {console.log(k);console.log(v);}

for...of與其它遍歷的比較

/*********************各種for循環的比較***************************** *///1、最原始的寫法就是for循環var arr1 = [1, 2, 3, 4, 5];for (var i = 0; i < arr1.length; i++) {console.log(arr1[i]);}//2、forEach方法:這種寫法的問題在于,無法中途跳出forEach循環,break命令或return命令都不能奏效arr1.forEach(function (item, index) {console.log(item);});//3、for...infor (let i in arr) {console.log(i); // 0 1 2 3 4獲取索引console.log(arr[i]);}for (let i in arr) {if (i == 3) {break;}console.log(i); //0 1 2 索引}//4、for...ofconst arr2 = ["a", "b", "c", "d", "e"];for (let v of arr2) {if (v == 3) {break; //用于跳出循環,會繼續執行該循環之后的代碼(如果有的話)//continue; //如果指定了條件,中斷當前的迭代,然后繼續循環中的下一個迭代。}console.log(v); //輸出的是元素}

各種類型的轉換

  //1、對象轉換為數組const o1 = { id: 1, name: "jack" };Object.keys(o1); //['id','name']Object.values(o1); //[1,'jack']console.log(Object.entries(o1)); //[ [ 'id', 1 ], [ 'name', 'jack' ] ]//2、map轉換為數組const m1 = new Map();m1.set("a", 1).set("b", 2).set("c", 3);console.log([...m1.keys()]); //[ 'a', 'b', 'c' ]console.log([...m1.values()]); //[ 1, 2, 3 ]console.log(...m1); //[ 'a', 1 ] [ 'b', 2 ] [ 'c', 3 ]console.log(...m1.entries());for (let v of m1.entries()) {console.log(v);}for (let v of [...m1]) {console.log(v);}//3、對象轉為mapvar o2 = { id: 1, value: "v" };let m2 = new Map(Object.entries(o2));//4、map轉對象const o3 = {};for (let [k, v] of m2) {console.log(v);o3[k] = v;}console.log(o3);

symbol數據結構

ES6 引入了一種新的原始數據類型Symbol,表示獨一無二的值

解決問題:如果添加的屬性名出現重復,如何保證屬性名的唯一性,解決屬性名的沖突

  let s = Symbol();let s1 = Symbol("a"); //這的參數a是描述symbol,通過描述可以區分不同的symbol/****************************************** */const o1 = {};o1.id = 10;o1.id = 20;//正常情況下,id=10將會被id=20覆蓋掉//如果想不被覆蓋掉???var id = Symbol("id1"); //id1是symbol的描述o1[id] = 30;var id = Symbol("id2"); //id2是symbol的描述o1[id] = 40;console.log(o1); //{ id: 20, [Symbol(id1)]: 30, [Symbol(id2)]: 40 }//第二種定義方式var id = Symbol("id");let o2 = { id: 10, [id]: 20 };console.log(o2); //{ id: 10, [Symbol(id)]: 20 }//獲取id的值console.log(o2.id); //返回默認的屬性值10console.log(o2[id]); //20 通過[id]的方式獲取symbol的屬性值。o2[id]:這的id對應的是變量//symbol即使描述相同,symbol()的返回值也不相同let s3 = Symbol("ITI");let s4 = Symbol("ITI");s3 === s4; // false//Symbol屬性值的獲取const o3 = { id: 10, [Symbol("id1")]: 20, [Symbol("id2")]: 30 };console.log(o3[Object.getOwnPropertySymbols(o3)[0]]);//20console.log(o3[Object.getOwnPropertySymbols(o3)[1]]);//30

注意symbol作為對象屬性名,不能用擴展運算符進行解析

使用symbol作用屬性名,Object.keys(),for...in不能輸出symbol類型的屬性名

Symbol.for()

由于symbol()每次調用都會返回一個不同的值,如果希望重新使用同一個Symbol 值, Symbol.for() 方法可以做到這一點

? let s5 = Symbol.for("ITI");

? let s6 = Symbol.for("ITI");

? console.log(s5 === s6);//true

Symbol.for()與Symbol()的區別

Symbol.for()與Symbol()這兩種寫法,都會生成新的 Symbol。區別是,前者會被登記在全局環境中供搜 索,后者不會。Symbol.for()不會每次調用就返回一個新的 Symbol 類型的值,而是會先檢查給定的key 是否已經存在,如果不存在才會新建一個值。比如,如果你調用Symbol.for("cat")30 次,每次都會返回 同一個 Symbol 值,但是調用Symbol("cat")`30 次,會返回 30 個不同的 Symbol 值

Promise

所謂 Promise,簡單說就是一個容器,里面保存著某個未來才會結束的事件(通常是一個異步操作)的結果。從語法上說,Promise 是一個對象,從它可以獲取異步操作的消息。Promise 提供統一的 API, 各種異步操作都可以用同樣的方法進行處理.

  //promise是一個構造函數,可以通過new Promise()得到一個promise實例//Promise構造函數接受一個函數作為參數--相當于傳一個回調。這個函數有兩個參數,分別是:resolve和reject//resolve和reject是兩個函數。這兩個函數是由JS引擎提供的//promise有三種狀態:pending(進行中)、fulfilled(已成功)、rejected(已失敗)//resolve的作用是:是將promise的狀態從進行中變成成功//reject的作用是:將promise的狀態從進行中轉換為rejected//then方法:當promise實例一旦生成了let p = new Promise(function (resolve, reject) {if (異步操作成功) {resolve("ok");} else {reject("error");}});//通過p的then方法能夠獲取promise內部的異步操作的狀態//then方法存在于Promise的prototype原型對象上p.then(function (res) { console.log(res); //ok},function (err) {console.log(err); //error});/*******************圖片加載實例******************************* */function LoadImg() {return new Promise((resolve, reject) => {const img = new Image();img.onload = function () {resolve(img);};img.onerror = function () {reject("error");};});}LoadImg().then((res) => {},(error) => {});

Promise---all

Promise.all() 方法用于將多個 Promise 實例,包裝成一個新的 Promise 實例

 /*******************promise.all():并發任務只有全部成功才會執行then方法******************** */let p2 = new Promise((resolve, reject) => {console.log("第一個異步任務");resolve("第一次異步結果");});let p3 = new Promise((resolve, reject) => {console.log("第二個異步任務");resolve("第二次異步結果");});let p4 = new Promise((resolve, reject) => {console.log("第三個異步任務");resolve("第三次異步結果");});Promise.all([p2, p3, p4]).then((arr) => {console.log(arr); //[ '第一次異步結果', '第二次異步結果', '第三次異步結果' ]});/************并發任務執行:這幾個任務都會執行,* 但是如果其中一個出現reject,則最后都不會執行Promise.all的then方法,而是執行Promise.all的catch方法* **************** */let p5 = new Promise((resolve, reject) => {console.log("第一個異步任務");resolve("第一次異步結果");});let p6 = new Promise((resolve, reject) => {console.log("第二個異步任務");reject("第二次異步結果失敗");});let p7 = new Promise((resolve, reject) => {console.log("第三個異步任務");resolve("第三次異步結果");});Promise.all([p5, p6, p7]).then((arr) => {console.log(arr);}).catch((err) => {console.log(err); //第二次異步結果失敗});

Promise---race

const p = Promise.race([p1, p2, p3]);

只要 p1 、 p2 、 p3 之中有一個實例率先改變狀態, p 的狀態就跟著改變。那個率先改變的 Promise 實例的返回值,就傳遞給p的回調函數

  /***************promise.race():獲取到的是最先執行異步任務的成功狀態的返回值********************** */let p8 = new Promise((resolve, reject) => {console.log("第一個異步任務");setTimeout(() => {resolve("第一次異步結果");}, 3000);});let p9 = new Promise((resolve, reject) => {console.log("第二個異步任務");setTimeout(() => {resolve("第二次異步結果");}, 2000);});let p10 = new Promise((resolve, reject) => {console.log("第三個異步任務");setTimeout(() => {resolve("第三次異步結果");}, 5000);});Promise.race([p8, p9, p10]).then((res) => {console.log(res); //第二次異步結果});/** 如果p9出現異常,則不會進行promise.race的then方法,而是需要promise.race設置一個catch方法*/

async-await

async function f () {
return 'hello world'
}
f(); //為什么沒有執行'hello world'

//執行f

f().then((res) => console.log(res));

函數前面加上async,如果執行這個函數,這個函數返回一個promise實例。相當于生成promise實例的簡單方法。

async修飾的function,默認是成功的狀態。return 'hello world'相當于resolve的返回值

await操作符用于等待一個Promise對象,它只能在異步函數async function內部使用

await 后面跟一個promise對象,但是也可以跟其他值,比如字符串、數值、普通函數

  console.log(1);async function f2() {console.log(2);await 100;//執行等待,后面的代碼變成微任務console.log(3);}f2();console.log(4);//整個代碼輸出:1 2 4 3

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

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

相關文章

正則表達式 \b:單詞邊界

下面舉例說明 \b 用法。\b(?:https?://)(\S)\b各部分功能&#xff1a;\b&#xff1a;單詞邊界&#xff0c;確保匹配的 URL 是獨立的單詞&#xff0c;不會與其他字符粘連。(?:https?://)&#xff1a;非捕獲組&#xff0c;匹配 http:// 或 https://&#xff08;s? 表示 s 可…

從8h到40min的極致并行優化:Spark小數據集UDTF處理的深度實踐與原理剖析

在大數據領域&#xff0c;Spark以其卓越的并行處理能力著稱。但面對小數據集的極致并行需求時&#xff0c;默認優化策略往往成為瓶頸。本文將深入剖析如何通過精準控制分區策略&#xff0c;將僅170條數據的表拆分成170個獨立Task并行執行&#xff0c;實現100%的并行度&#xff…

JAVA算法題練習day1

開始前&#xff1a; 選擇leetcode-hot100。要求每日1道&#xff0c;并且需要親自二刷昨天的題目&#xff08;每一種解法&#xff09;&#xff0c;要做解題筆記并發布CSDN&#xff0c;做完立刻二刷。做題時間為每日12&#xff1a;50起&#xff0c;不拖延&#xff0c;這是學習成…

【Word Press進階】自定義區塊的行為與樣式

前兩篇 【Word Press基礎】創建自定義區塊【Word Press基礎】創建一個動態的自定義區塊 說明白了怎么創建一個簡單的靜態區塊。但實在是太丑了。這里再進行一個優化&#xff0c;讓咱們的區塊好看又好用。 一個合格的區塊應當有著好看的外表&#xff0c;完整的功能&#xff0…

Pygame模塊化實戰:火星救援游戲開發指南

Pygame模塊化實戰&#xff1a;火星救援游戲開發指南用Python打造太空探險游戲&#xff0c;掌握模塊化開發核心技巧一、火星救援&#xff1a;模塊化開發的完美場景??想象這樣的場景??&#xff1a; 你是一名宇航員&#xff0c;被困在火星表面&#xff0c;需要收集資源、修復飛…

三維圖像識別中OpenCV、PCL和Open3D結合的主要技術概念、部分示例

文章目錄1. 三維點云基礎概念點云(Point Cloud)深度圖像(Depth Image)體素(Voxel)2. 點云預處理技術去噪濾波(Noise Filtering)降采樣(Downsampling)3. 特征提取與描述法向量估計(Normal Estimation)關鍵點檢測(Keypoint Detection)特征描述子(Feature Descriptor)4. 點云配準(…

7.23數據結構——單鏈表

文章目錄一、思維導圖二、單鏈表代碼head.htext.cmain.c現象一、思維導圖 二、單鏈表代碼 head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdlib.h> #include <stdio.h> #include <string.h>enum A {FAULSE-1,//失敗返回SUCCESS//成功返回};//給…

某種物聯網SIM卡流量查詢方法

說起流量卡,很多人可能還停留在營業廳辦理的常規套餐里。但其實在 2016 年,三大運營商就推出了一種資費更為劃算的正規流量卡 —— 物聯卡。當年,當不少人還在用 50 元 1G 的流量時,第一批體驗物聯卡的用戶已經享受到了 53 元 6G 的全國流量,徹底擺脫了流量焦慮。不過,至…

XTTS實現語音克隆:精確控制音頻格式與生成流程【TTS的實戰指南】

言簡意賅的講解XTTS解決的痛點 &#x1f4ce; 前置操作&#xff1a;如何使用 OBS Studio 錄制高質量 WAV 語音&#xff08;建議先閱讀并準備錄音樣本&#xff09; 本教程介紹如何使用 Coqui TTS 的 XTTS v2 模型 實現中文語音克隆&#xff0c;支持直接傳入 .wav 文件&#xff0…

C/C++中常量放置在比較操作符左側

目錄 介紹 原因詳解 避免誤用賦值運算符 示例對比 結論 介紹 在編程中&#xff0c;將常量放在比較操作符&#xff08;如 或 !&#xff09;的左側&#xff08;例如 if (42 value)&#xff09;&#xff0c;是一種被稱為 "Yoda 條件"&#xff08;Yoda Conditions…

Node.js 模擬 Linux 環境

&#x1f9e9; 項目介紹 該項目使用 Node.js 實現了一個模擬的 Linux 終端環境&#xff0c;支持多種常見的 Linux 命令&#xff08;如 ls, cd, cat, mkdir, rm 等&#xff09;&#xff0c;所有文件操作都在內存中進行&#xff0c;并持久化到本地文件系統中。適合用于學習 Shel…

HAProxy 實驗指南:從零開始搭建高可用負載均衡系統

引言HAProxy&#xff08;High Availability Proxy&#xff09;是一款高性能的TCP/HTTP負載均衡器和代理服務器&#xff0c;廣泛用于構建高可用、可擴展的Web架構。它由法國開發者Willy Tarreau于2000年開發&#xff0c;如今已成為開源社區和企業級應用中不可或缺的工具。HAProx…

2.10DOM和BOM插入/移除/克隆

1.DOM創建/插入/移除/克隆1.1創建元素前面我們使用過 document.write 方法寫入一個元素&#xff1a;這種方式寫起來非常便捷&#xff0c;但是對于復雜的內容、元素關系拼接并不方便&#xff1b;它是在早期沒有 DOM 的時候使用的方案&#xff0c;目前依然被保留了下來&#xff1…

華為倉頡編程語言的表達式及其特點

華為倉頡編程語言的表達式及其特點 倉頡&#xff08;Cangjie&#xff09;語言的表達式有一個明顯的特點&#xff0c;范圍不再局限于傳統算術運算&#xff0c;而是擴展到條件表達式、循環表達式等多種類型&#xff0c;每種表達式均有確定的類型和值。 傳統基本表達式&#xff0…

【linux】keepalived

一.高可用集群1.1 集群類型LB&#xff1a;Load Balance 負載均衡 LVS/HAProxy/nginx&#xff08;http/upstream, stream/upstream&#xff09; HA&#xff1a;High Availability 高可用集群 數據庫、Redis SPoF: Single Point of Failure&#xff0c;解決單點故障 HPC&#xff…

Webpack配置原理

一、Loader&#xff1a; 1、定義&#xff1a;將不同類型的文件轉換為 webpack 可識別的模塊2、分類&#xff1a; ① pre&#xff1a; 前置 loader &#xff08;1&#xff09;配置&#xff1a;在 webpack 配置文件中通過enforce進行指定 loader的優先級配置&#xff08;2&#x…

對比JS“上下文”與“作用域”

下面從定義、特性、示例&#xff0c;以及在代碼分析中何時側重“上下文”&#xff08;Execution Context/this&#xff09;和何時側重“作用域”&#xff08;Scope/變量查找&#xff09;&#xff0c;以及二者結合的場景來做對比和指導。一、概念對比 | 維度 | 上下文&#xff0…

如何做數據增強?

目錄 1、為什么要做數據增強&#xff1f; 2、圖像數據增強&#xff1f; 3、文本與音頻數據增強&#xff1f; 4、高級數據增強&#xff1f; 數據增強技術就像是一種“造數據”的魔法&#xff0c;通過對原始數據進行各種變換&#xff0c;生成新的樣本&#xff0c;從而提高模型…

Go by Example

網頁地址Go by Example 中文版 Github倉庫地址mmcgrana/gobyexample&#xff1a;按示例進行 HelloWorld package mainimport ("fmt" )func main() {fmt.Println("Hello World") } Hello World 值 package mainimport ("fmt" )func main() {…

ClickHouse高性能實時分析數據庫-消費實時數據流(消費kafka)

告別等待&#xff0c;秒級響應&#xff01;這不只是教程&#xff0c;這是你駕馭PB級數據的超能力&#xff01;我的ClickHouse視頻課&#xff0c;凝練十年實戰精華&#xff0c;從入門到精通&#xff0c;從單機到集群。點開它&#xff0c;讓數據處理速度快到飛起&#xff0c;讓你…