06-ES6

微任務&宏任務

JS是單線程執行。所有要執行的任務都要排隊。

所有的同步任務會在主線程上排隊,等待執行。

異步任務:不會進入主線程,而是會進入任務隊列。等到主線程上的任務執行完成之后,通知任務隊列,執行異步任務。

在任務隊列中,也存在著簡單的任務和復雜的任務,因此,把任務隊列中的復雜任務稱為宏任務,把簡單的任務稱為微任務。

在主線程執行完同步任務后,先去執行任務隊列的微任務,然后是宏任務

  console.log(1); //同步任務let p = new Promise((resolve) => {console.log(2); //promise內部也是同步任務resolve(3); //異步任務---微任務});p.then((res) => {{console.log(res);}});console.log(4); //同步任務//1 2 4 3

微任務有:

  1. promise的then方法
  2. async...await 后面的代碼

宏任務有:

  1. setTimeout
  2. setinterval
  setTimeout(() => {console.log(0); //宏任務}, 100);console.log(1); //同步任務let p1 = new Promise((resolve) => {console.log(2); //promise內部也是同步任務resolve(3); //異步任務---微任務});p1.then((res) => {{console.log(res);}});console.log(4); //同步任務//輸出:1 2 4 3 0
  function f2() {console.log(1);}console.log(2);async function f3() {console.log(3);await f2(); //f2為什么會在console.log(5)前執行?console.log(4);}f3();console.log(5);//輸出2 3 1 5 4//await f2()會同步執行,實際上await后面的代碼會放到任務隊列中作為微任務去執行

class

ES5中定義類

? /*******************ES5中定義類,通過構造函數定義對象****************** */

? function Point(x, y) {

? ? this.x = x;

? ? this.y = y;

? }

? Point.prototype.toString = function () {

? ? return this.x;

? };

? var p = new Point(2, 4);

ES6中定義類

? class Animal {?

? ? constructor(name) {

? ? ? this.name = name;

? ? }

? ? speak() {

? ? ? console.log(this.name + ":hello world");

? ? }

? }

? let animal = new Animal("jack");

? animal.speak();

ES6 的class可以看作只是一個語法糖【type of?Animal 是一個function】,它的絕大部分功能,ES5 都可以做到。

constructor是類中默認的方法,雖然沒有在Point中顯式定義constructor。constructor存在于Point類的原型對象中。

class只能通過new運算符進行構造?

  class Point {}let p2 = Point();//Uncaught TypeError: Class constructor Point cannot be invoked without 'new'

class繼承

  class Point {constructor(x, y) {this.x = x;this.y = y;}coordinate() {return [this.x, this.y];}}//extends&super配使用實現繼承class CircleDot extends Point {//extends關鍵字實現繼承constructor(x, y) {super(x, y); //關鍵字,代表父類的構造函數//super相當于:Point.prototype.constructor.apply(this);}}let dot = new CircleDot(10, 20);//當子類和父屬性重名,子類屬性將覆蓋從父類繼承來的屬性//當子類和父方法重名,子類方法將覆蓋從父類繼承來的方法class Point {constructor(x, y) {this.x = x;this.y = y;}coordinate() {return [this.x, this.y];}}class CircleDot extends Point {constructor(x, y, z) {super(x, y);this.x = z;}coordinate() {console.log("CircleDot");super.coordinate(); //調用父類的方法}}let circle = new CircleDot(1, 2, 3);

類的多重繼承

一個類可以繼承多個父類叫多繼承

class默認不直接支持多繼承。extends只能從一個類繼承。Object.assign(Animal.prototype, EatMixin, SleepMixin)

  //定義一個混合特性let EatMixin = {eat() {console.log("eat");},};let SleepMixin = {sleep() {console.log("sleep");},};class Animal {}Object.assign(Animal.prototype, EatMixin, SleepMixin);//混合特性let a = new Animal();a.eat();

ES6模塊化

模塊通常是指編程語言所提供的代碼組織機制,利用此機制可將程序拆解為獨立且通用的代碼單元。所謂模塊化主要是解決代碼分割、作用域隔離、模塊之間的依賴管理以及發布到生產環境時的自動化打包與處理等多個方面

簡單的說:模塊化就是將變量和函數 放入不同的文件中

ES6模塊(module)

模塊Module 一個模塊,就是一個對其他模塊暴露自己的屬性或者方法的文件

導出Export,作為一個模塊,它可以選擇性地給其他模塊暴露(提供)自己的屬性和方法,供其他模塊使用

針對默認的模塊文件:module.js

//一個文件內可以進行多次導出

export const n1 =10;

export const n2 =20;

export const n3 =30;

在引用時,使用:import { n1, n2, n3 } from "./module";

為什么使用{}進行導入接收。默認一個模塊文件,在導出時是一個對象

const id = 1;

const name = "jack";

const msg = "success";

function sum(n1, n2) {

? return n1 + n2;

}

//直接暴露,很清晰

export { id, name, msg, sum };

使用時:

import { id, name, msg, sum } from './module2'

導出時使用別名:export { id as _id, name as _name, msg as _msg, sum };

導入時使用別名:import { id, name, msg, sum as _sum } from './module2'

export default {

? x: "x",

? y: "y",

};

使用的時候:

import obj from './module3'

  1. 如果使用export {}或者export const a ,引入的時候,import {} from ''---需要加{}
  2. 如果使用export default {},import 不需要加{},直接使用obj進行接收

export default { x: "x", y: "y" };

export const a = 1;

export const b = 2;

引入時:

import obj, { a, b } from './module5'

Proxy

proxy 在目標對象的外層搭建了一層攔截,外界對目標對象的某些操作,必須通過這層攔截

var proxy = new Proxy(target, handler);

target:目標對象;

handler:具體攔截的行為

基本使用

  //目標對象let target = {id: 1,};let handler = {}; //行為也是一個對象let proxy = new Proxy(target, handler);console.log(proxy.id); //通過代理對象獲取原對象的屬性//具體的實現方式:handler有2個屬性let handler = {get: function (target, property) {console.log("handler");return target[property];},}; //行為也是一個對象let proxy = new Proxy(target, handler);console.log(proxy.id); //通過代理對象獲取原對象的屬性  

handler 本身就是 ES6 所新設計的一個對象.它的作用就是用來 自定義代理對象的各種可代理操 作 。它本身一共有 13 中方法,每種方法都可以代理一種操作.其 13 種方法如下:

  1. get(target,property):攔截對象屬性的讀取
  2. set(target,prokey,value):攔截對象屬性的設置
  3. has(target, propKey):攔截propKey in proxy的操作,返回一個布爾值
  4. deleteProperty(target, propKey):攔截delete proxy[propKey]的操作,返回一個布爾值
  5. ownKeys(target):攔截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、 Object.keys(proxy)、for...in循環,返回一個數組。該方法返回目標對象所有自身的屬性的屬性名,而 Object.keys()的返回結果僅包括目標對象自身的可遍歷屬性
  6. getOwnPropertyDescriptor(target, propKey):攔截Object.getOwnPropertyDescriptor(proxy, propKey),返回屬性的描述對象?
  7. defineProperty(target, propKey, propDesc):攔截Object.defineProperty(proxy, propKey, propDesc)、 Object.defineProperties(proxy, propDescs),返回一個布爾值
  8. preventExtensions(target):攔截Object.preventExtensions(proxy),返回一個布爾值
  9. getPrototypeOf(target):攔截Object.getPrototypeOf(proxy),返回一個對象。
  10. isExtensible(target):攔截Object.isExtensible(proxy),返回一個布爾值
  11. setPrototypeOf(target, proto):攔截Object.setPrototypeOf(proxy, proto),返回一個布爾值。如果目標對象是函數,那么還有兩種 額外操作可以攔截。
  12. apply(target, object, args):攔截 Proxy 實例作為函數調用的操作,比如proxy(...args)、proxy.call(object, ...args)、 proxy.apply(...)
  13. construct(target, args):攔截 Proxy 實例作為構造函數調用的操作,比如new proxy(...args)。

Object.defineProperty()與Proxy

  /*********************Object.defineProperty()與Proxy的異同************************ */let obj = {};Object.defineProperty(obj, "arr", {get: function () {console.log("Get");return v;},set: function (value) {console.log("Set");v = value;},});obj.arr = []; //觸發setobj.arr = [1, 2, 3]; //觸發setobj.arr.push(10); //沒有觸發set,而是觸發getobj.arr[3] = 4; //沒有觸發set,而是觸發get//vue2通過Object.defineProperty實現雙向綁定,//但是針對數組類型,通過push等操作數組的方法雖然能夠改變數組的值,但是不能觸發界面更新//vue2的解決辦法是:this.$set()方法/********************Vue3***************** */let arr = [];let handler3 = {set: function (target, property, value) {console.log("set");target[property] = value;return true;},get: function (target, property) {console.log("Get");return target[property];},};let p2 = new Proxy(arr, handler3);p2.push(10); //觸發了4次,包括2次get,2次set

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

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

相關文章

FreeSWITCH配置文件解析(10) 配置IP封禁(防暴力破解)

以下是針對FreeSWITCH配置IP封禁(防暴力破解)的完整方案,結合Fail2Ban與系統級防護策略:一、Fail2Ban核心配置(推薦方案)??啟用FreeSWITCH鑒權日志??修改SIP Profile(conf/sip_profiles/int…

【React 入門系列】React 組件通訊與生命周期詳解

🧩 第一章:組件通訊概述在 React 開發中,組件是封裝的、獨立的功能單元。為了實現組件間的數據共享與協作,需要通過組件通訊機制。組件通訊的意義: 讓多個封閉的組件能夠共享數據,實現協作功能。&#x1f4…

前端開發 Vue 狀態優化

Vue 項目中的狀態優化一般都會用Pinia替代Vuex,Pinia 是 Vue 生態系統中的一個輕量級狀態管理庫,作為 Vuex 的替代品,它提供了更簡潔的 API 和更好的性能。模塊化管理:使用 Pinia 時,建議將狀態拆分為多個 store 模塊&…

虛幻基礎:創建角色——FPS

能幫到你的話,就給個贊吧 😘 文章目錄創建角色設置模型添加攝像機添加位置:插槽彈簧臂:伸縮防止由碰撞導致攝像機穿模攝像機添加武器添加位置:插槽創建動畫藍圖:主動獲取角色數據并播放相應動畫設置角色控制…

2025年入局蘋果Vision Pro開發:從零到發布的完整路線圖

蘋果Vision Pro的發布標志著空間計算(Spatial Computing)進入主流市場。作為開發者,如何快速掌握visionOS開發?本文將為你提供詳細的路線圖、實踐建議與資源指南,涵蓋從窗口式應用到沉浸式3D應用的完整開發路徑。 一、visionOS開發的核心目標與階段劃分 visionOS的開發可…

百度文心大模型ERNIE全面解析

百度文心大模型ERNIE概述 百度推出的文心大模型(ERNIE,Enhanced Representation through kNowledge IntEgration)系列是結合知識增強技術的預訓練大模型,涵蓋自然語言處理(NLP)、跨模態、行業應用等多個方向。其開源版本為開發者提供了可商用的大模型能力支持。 ERNIE的…

【SpringAI實戰】提示詞工程實現哄哄模擬器

一、前言 二、實現效果 三、代碼實現 3.1 后端實現 3.2 前端實現 一、前言 Spring AI詳解:【Spring AI詳解】開啟Java生態的智能應用開發新時代(附不同功能的Spring AI實戰項目)-CSDN博客 二、實現效果 游戲規則很簡單,就是說你的女友生氣了&#x…

速通python加密之AES加密

AES加密 AES加密(Advanced Encryption Standard,高級加密標準)是目前全球公認的最安全、應用最廣泛的對稱加密算法之一,于2001年被美國國家標準與技術研究院(NIST)確定為替代DES的標準加密算法,…

Java 對象秒變 Map:字段自由伸縮的優雅實現

前言 在開發中,我們常常需要把對象轉成 Map 格式,用于序列化、傳輸、展示,甚至硬塞給某些第三方框架吃進去再吐出來。乍一看很簡單,字段多起來后就像打翻調色盤,維護起來一不小心就翻車。想優雅地搞定這事,必須有一套穩妥、可擴展的方案,才能寫出讓同事膜拜、領導點贊、…

激光雷達-相機標定工具:支持普通相機和魚眼相機的交互式標定

激光雷達-相機標定工具:支持普通相機和魚眼相機的交互式標定 前言 在自動駕駛、機器人導航等領域,激光雷達和相機的標定是一個基礎而重要的問題。準確的標定結果直接影響后續的感知算法性能。本文將介紹一個開源的激光雷達-相機標定工具,支持…

linux shell從入門到精通(二)——變量操作

1.什么是變量變量在許多程序設計語言中都有定義,與變量相伴地有使用范圍地定義。Linux Shell也不例外。變量,本質上就是一個鍵值對。例如:str“hello”就是將字符串值“hello”賦予鍵str。在str地使用范圍內,我們都可以用str來引用…

[Linux入門] 初學者入門:Linux DNS 域名解析服務詳解

目錄 一、域名服務基礎:從 “名字” 到 “地址” 的轉換 1??什么是域名? 2??什么是 DNS? 3??DNS 用 TCP 還是 UDP? 二、DNS 服務器:各司其職的 “導航站” 1??根域名服務器 2??頂級域名服務器 3??權…

iview表單驗證一直提示為空的幾個原因?

1.Form上的rules是否配置正確; 2.Form-item的prop是否配置正確; 3.規則的名稱和input的v-model是否對應; 4.驗證的字段是否響應,新增字段使用this. $set. © 著作權歸作者所有,轉載或內容合作請聯系作者 平臺聲明&#xff1…

SpringBoot3(若依框架)集成Mybatis-Plus和單元測試功能,以及問題解決

一、Mybatis-Plus集成 新增依賴到父級pom.xml,原先的mybatis依賴可以不動需要注意 mybatis-plus與mybatis版本之間的沖突,不要輕易改動依賴,不然分頁也容易出現問題分類頂級pom.xml下面,如果沒有引入還是出現報錯,在co…

刪除遠程分支上非本分支的提交記錄

要刪除遠程分支上非本分支的提交記錄(即主分支的提交歷史),需要使用 Git 的重寫歷史功能。以下是完整解決方案: 解決方案步驟: 創建干凈的新分支(基于主分支最新提交) # 切換到主分支并更新 git…

Flask input 和datalist結合

<input list"categories" name"category" id"category" class"form-control" placeholder"任務分類" required> 這段代碼是一個 HTML 輸入控件&#xff0c;結合了 <input> 和 <datalist>&#xff0c;用來…

嵌入式分享#27:原來GT911有兩個I2C地址(全志T527)

最近在調試全志T527的觸摸功能時&#xff0c;發現GT911觸摸芯片的I2C地址有時是0x5d&#xff0c;有時又識別成0x14&#xff0c;不知道大家有沒有遇到過類似這個情況。雖然最后使用0x5d地址調通了觸摸功能&#xff0c;但是一直還是很困惑&#xff0c;為什么會出現0x14和0x5d兩個…

Linux運維新人自用筆記(Rsync遠程傳輸備份,服務端、郵箱和客戶端配置、腳本)

內容全為個人理解和自查資料梳理&#xff0c;歡迎各位大神指點&#xff01;每天學習較為零散。day24一、Rsync傳輸文件#安裝rsync#-a遞歸同步&#xff08;包含子目錄&#xff09;保留文件權限、所有者、組、時間戳等元數據 #??-z傳輸時壓縮數據 #??-v顯示詳細同步過程 #??…

以 “有機” 重構增長:云集從電商平臺到健康生活社區的躍遷

當電商行業陷入流量爭奪的紅海&#xff0c;同質化運營模式難以突破增長瓶頸時&#xff0c;云集以從精選電商到有機生活平臺的戰略轉型&#xff0c;開辟出差異化發展路徑。其轉型并非憑經驗決斷的孤例&#xff0c;而是建立在對市場趨勢的精準研判、用戶需求的深度解碼&#xff0…

【2025最新版】midjourney小白零基礎入門到精通教程!人工智能繪圖+AI繪圖+AI畫圖,一鍵出圖教程 (持續更新)

前言 現在市面上相關的AI繪畫工具非常多&#xff0c;有6pen.art、Stable Diffusion、DALL.E、Midjourney等。 而MJ就目前而言&#xff0c;它是一款強大的人工智能工具&#xff0c;旨在幫助設計師和創意人員完成各種設計任務。 非常適合我們圖像工作者&#xff0c;從 UI 設計到…