Web前端ES6-ES13筆記合集(下)

#### 五.ES10新特性

##### 1. Object.fromEntries

> Object.fromEntries()方法允許你輕松地將鍵值對列表轉換為對象

```js

const arr = [["name", "kerwin"], ["age", 100]];

console.log(Object.fromEntries(arr))//{name: 'kerwin', age: 100}

const m = new Map()

m.set("name","tiechui")

m.set("age",18)

console.log(Object.fromEntries(m))

```

**用處**

```js

let str ="name=kerwin&age=100"

let searchParams = new URLSearchParams(str)

console.log(Object.fromEntries(searchParams))//{name: 'kerwin', age: '100'}

```

##### 2. trimStart() and trimEnd()

> trimStart()和trimEnd()方法在實現與trimLeft()和trimRight()相同。

```js

let str = " ? kerwin ? ?"

console.log("|"+str.trimStart(str)+"|")

console.log("|"+str.trimEnd(str)+"|")

console.log("|"+str.trimLeft(str)+"|")

console.log("|"+str.trimRight(str)+"|")

```



?

##### 3. Symbol 對象的 description 屬性

> 為Symbol對象添加了只讀屬性 description ,該對象返回包含Symbol描述的字符串。

```js

let s = Symbol("kerwin")

console.log(s.description) //kerwin

```

##### 4. 可選的 catch

```js

let pro1 = new Promise(function (resolve, reject) {

? ? //執行器函數

? ? setTimeout(() => {

? ? ? ? resolve("成功的結果")

? ? }, 30000)

})

let pro2 = new Promise(function (resolve, reject) {

? ? //執行器函數

? ? setTimeout(() => {

? ? ? ? reject()

? ? }, 2000)

})

async function test() {

? ? try {

? ? ? ? await Promise.race([pro1, pro2])

? ? } catch {

? ? ? ? console.log("不關心錯誤結果,網絡超時")

? ? }

}

test()

```





?

#### 六. ES11新特性

##### 1. Promise.allSettled

> Promise.allSettled() 方法返回一個在所有給定的 promise 都已經 fulfilled 或 rejected 后的 promise ,并帶有一個對象數組,每個對象表示對應的 promise 結果。

```js

const promises = [ ajax('/200接口'), ajax('/401接口') ];

Promise.allSettled(promises).then(results=>{

? ? // 過濾出成功的請求

? ? results.filter(item =>item.status === 'fulfilled');

? ? 過濾出失敗的請求

? ? results.filter(item=> item.status === 'rejected');

})

```



?

##### 2.module新增

###### 2-1 動態導入 import()

> 標準用法的 import 導入的模塊是靜態的,會使所有被導入的模塊,在加載時就被編譯(無法做到按需編譯,降低首頁加載速度)。有些場景中,你可能希望根據條件導入模塊或者按需導入模塊,這時你可以使用動態導入代替靜態導入。

```js

<body>

? ? <button>login</button>

? ? <script type="module">

? ? ? ? let role1 = "管理員"

? ? ? ? let role2 = "普通用戶"

? ? ? ? function login(){

? ? ? ? ? ? return "普通用戶"

? ? ? ? }

? ? ? ? async function render(role){

? ? ? ? ? ? if(role===role1){

? ? ? ? ? ? ? ? let res1 = await import("./1.js")

? ? ? ? ? ? ? ? console.log(res1.default)

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? let res2 = await import("./2.js")

? ? ? ? ? ? ? ? console.log(res2.default)

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? let obtn = document.querySelector("button")

? ? ? ? obtn.onclick = function(){

? ? ? ? ? ? let role = login()

? ? ? ? ? ? render(role)

? ? ? ? }

? ? </script>

</body>

```



?

###### 2-2 import.meta

import.meta 會返回一個對象,有一個 url 屬性,返回當前模塊的url路徑,只能在模塊內部使用。

```js

<script type="module">

? ? ? ? import obj from './1.js'

</script>


?

//1.js

console.log(import.meta)

export default {

? ?

}

```



?

###### 2-3 export * as obj from 'module'

```js

//1.js

export default {

? ? name:'111111'

}

export function test1(){

? ?

}

//2.js

export default {

? ? name:"22222"

}

export function test2(){

? ?

}

export * as obj1 from './1.js'

//html

?<script type="module">

? ? ? ? import * as obj from './2.js'

? ? ? ? console.log(obj)

?</script>

```



?

<img src="%E7%AC%94%E8%AE%B0.assets/image-20220922111416681.png" alt="image-20220922111416681" style="zoom:67%;float:left;" />





?

##### 3.字符串的matchAll方法

> matchAll() 方法返回一個包含所有匹配正則表達式的結果的迭代器。可以使用 for...of 遍歷,或者使用 展開運算符(...) 或者 Array.from 轉換為數組.

```js

let str = `

<ul>

<li>1111</li>

<li>2222</li>

<li>3333</li>

<li>4444</li>

</ul>

`

let reg = /<li>(.*)<\/li>/g

console.log(str.match(reg))

//'<li>1111</li>', '<li>2222</li>', '<li>3333</li>', '<li>4444</li>'

```

```js

let str = `

<ul>

<li>1111</li>

<li>2222</li>

<li>3333</li>

<li>4444</li>

</ul>

`

let reg = /<li>(.*)<\/li>/g

let match = null;

while(match = reg.exec(str)){

? ? console.log(match[0])

? ? console.log(match[1])

}

```



?

```js

let str = `

<ul>

<li>1111</li>

<li>2222</li>

<li>3333</li>

<li>4444</li>

</ul>

`

let reg = /<li>(.*)<\/li>/g

for(let i of str.matchAll(reg)){

? ? console.log(i)

}

```





?

##### 4. BigInt

> JavaScript 能夠準確表示的整數范圍在-2^53到2^53之間(不含兩個端點),超過這個范圍,無法精確表示這個值,這使得 JavaScript 不適合進行科學和金融方面的精確計算。

```js

9007199254740992 //9007199254740992

9007199254740993 //9007199254740992

Math.pow(2,53) === Math.pow(2,53)+1

```



?

為了與 Number 類型區別,BigInt 類型的數據必須添加后綴`n`。

```js

1234 // 普通整數

1234n // BigInt

// BigInt 的運算

1n + 2n // 3n

```



?

##### 5. globalThis

> globalThis 提供了一個標準的方式來獲取不同環境下的全局 this 對象(也就是全局對象自身)。不像 window 或者 self這些屬性,它確保可以在有無窗口的各種環境下正常工作。所以,你可以安心的使用 globalThis,不必擔心它的運行環境。為便于記憶,你只需要記住,全局作用域中的 this 就是 globalThis。

>

```js

//es6-shim

var getGlobal = function () {

// the only reliable means to get the global object is

? ? // Function('return this')()

? ? // However, this causes CSP violations in Chrome apps.

? ? ?if (typeof self !== 'undefined') { return self; }

? ?

? ? ? ? if (typeof window !== 'undefined') { return window; }

? ?

? ? ? ? if (typeof global !== 'undefined') { return global; }

? ?

? ? ? ? throw new Error('unable to locate global object');

};

var globals = getGlobal();

if (!globals.Reflect) {

defineProperty(globals, ‘Reflect’, {}, true);

}

```



?

```js

//以前

var getGlobal = function () {

? ? if (typeof self !== 'undefined') { return self; }

? ? if (typeof window !== 'undefined') { return window; }

? ? if (typeof global !== 'undefined') { return global; }

? ? throw new Error('unable to locate global object');

};

let globals = getGlobal()

if (globals.document) {

? ? console.log("進行dom操作相關")

} else {

? ? console.log("不能進行dom操作")

}

//現在

if (globalThis.document) {

? ? console.log("進行dom操作相關")

} else {

? ? console.log("不能進行dom操作")

}

```





?

##### 6.空值合并運算符

> **空值合并運算符(*??*)**是一個邏輯運算符。當左側操作數為 null 或 undefined 時,其返回右側的操作數。否則返回左側的操作數。

```js

let obj = {

? ? name:"kerwin",

? ? introduction:0

}

console.log(obj.introduction || "這個人很懶")

console.log(obj.introduction ?? "這個人很懶")

```

**??和 || 的區別是什么呢?**

他們兩個最大的區別就是 ’ '和 0,??的左側 為 ’ '或者為 0 的時候,依然會返回左側的值;

|| 會對左側的數據進行boolean類型轉換,所以’ '和 0 會被轉換成false,返回右側的值



?

##### 7.可選鏈操作符

> 可選鏈前面的值如果是null或undefined,則不再執行后面的,之前返回可選鏈前面的值

```js

let obj = {

? ? name:"kerwin",

? ? introduction:0,

? ? // location:{

? ? // ? ? city:"dalian"

? ? // }

}

console.log(obj && obj.location && obj.location.city)

console.log(obj?.location?.city)

```



?

#### 七. ES12新特性

##### 1. 邏輯賦值操作符

邏輯賦值操作符 ??=、&&=、 ||=

```js

let a = true

let b = false

//a &&= b //false

a ||= b ; //true

console.log(a)


?

let obj = {

? ? name:"kerwin", ? ? ? ? ?

}

obj.introduction = obj.introduction??"很懶"

obj.introduction??="很懶"

```





?

##### 2.數字分隔符

這個新特性是為了方便程序員看代碼而出現的,如果數字比較大,那么看起來就不是那么一目了然

```js

const num= 123456789;

```

分隔符不僅可以分割十進制,也可以分割二凈值或者十六凈值的數據,非常好用。

```javascript

const number = 1_000_000_000_000;

const binary = 0b1010_0101_1111_1101;

const hex = 0xA1_B2_C3;

```





?

##### 3. replaceAll

> 所有匹配都會被替代項替換。模式可以是字符串或正則表達式,而替換項可以是字符串或針對每次匹配執行的函數。并返回一個全新的字符串 ?

```js

const str =

? ? ? "I wish to wish the wish you wish to wish, but if you wish the wish the witch wishes, I won't wish the wish you wish to wish. ";

const newStr = str.replaceAll("wish", "kerwin");

console.log(newStr);

```





?

##### 4.Promise.any

只要參數實例有一個變成`fulfilled`狀態,包裝實例就會變成`fulfilled`狀態;如果所有參數實例都變成`rejected`狀態,包裝實例就會變成`rejected`狀態。

> `Promise.any()`跟`Promise.race()`方法很像,只有一點不同,就是`Promise.any()`不會因為某個 Promise 變成`rejected`狀態而結束,必須等到所有參數 Promise 變成`rejected`狀態才會結束。

##### 5. WeakRef



?

> 在一般情況下,對象的引用是強引用的,這意味著只要持有對象的引用,它就不會被垃圾回收。只有當該對象沒有任何的強引用時,垃圾回收才會銷毀該對象并且回收該對象所占的內存空間。

>

> 而 `WeakRef` 允許您保留對另一個對象的弱引用,而不會阻止被弱引用對象被垃圾回收。

```js

let target = {};

let wr = new WeakRef(target);

```

WeakRef 實例對象有一個`deref()`方法,如果原始對象存在,該方法返回原始對象;如果原始對象已經被垃圾回收機制清除,該方法返回`undefined`。

```js

let target = {};

let wr = new WeakRef(target);

let obj = wr.deref();

if (obj) { // target 未被垃圾回收機制清除

? // ...

}

```



?

```js

let like = new WeakRef(document.getElementById("like"))

let mymap = new WeakMap()

mymap.set(like.deref(), {

? ? click: 0

})

like.deref().onclick = function () {

? ? let times = mymap.get(like.deref())

? ? times.click++

}

setTimeout(() => {

? ? document.body.removeChild(like.deref())

}, 2000)

```





?

##### 6. FinalizationRegistry

> 清理器注冊表功能 FinalizationRegistry,用來指定目標對象被垃圾回收機制清除以后,所要執行的回調函數。

首先,新建一個注冊表實例。

```javascript

const registry = new FinalizationRegistry(data => {

? // ....

});

```

```javascript

registry.register(obj, "some value");

registry.unregister(obj);

```



?

```js

let like = new WeakRef(document.getElementById("like"))

let mymap = new WeakMap()

mymap.set(like.deref(), {

? ? click: 0

})

like.deref().onclick = function () {

? ? let times = mymap.get(like.deref())

? ? times.click++

}

setTimeout(() => {

? ? // registry.register(document.getElementById("like"), mymap.get(like.deref()));

? ? registry.register(like.deref(), mymap.get(like.deref()));

? ? document.body.removeChild(like.deref())

}, 2000)


?

const registry = new FinalizationRegistry(data => {

? ? // ....

? ? console.log("被銷毀了", data)

});

```







?

#### 八.ES13新特性

##### 1. 私有屬性和方法

```js

class Cache{

? ? #obj ?={}

? ? get(key){

? ? ? ? return this.#obj[key]

? ? }

set(key,value){

? ? this.#obj[key] =value

}

}

let cache = new Cache()

cache.set("name","kerwin")

```

##### 2.靜態成員的私有屬性和方法

> 我們還可以給類定義靜態成員和靜態私有函數。類的靜態方法可以使用`this`關鍵字訪問其他的私有或者公有靜態成員,

```js

?class Cache{

? ? ?static #count = 0;

? ? ?static getCount(){

? ? ? ? ?return this.#count

? ? ?}

? ? #obj ?={}

? ? get(key){

? ? ? ? return this.#obj[key]

? ? }

? ? set(key,value){

? ? ? ? this.#obj[key] =value

? ? }

}

let cache = new Cache()

cache.set("name","kerwin")

console.log(Cache.getCount())

```



?

##### 3.靜態代碼塊

> ES13允許在類中通過`static`關鍵字定義一系列靜態代碼塊,這些代碼塊只會在類被創造的時候**執行一次**。這其實有點像一些其他的如C#和Java等面向對象的編程語言的靜態構造函數的用法。



?

一個類可以定義任意多的靜態代碼塊,這些代碼塊會和穿插在它們之間的靜態成員變量一起按照定義的順序在類初始化的時候執行一次。我們還可以使用`super`關鍵字來訪問父類的屬性。

```js

?class Cache{

? ? static obj = new Map()

? ? static {

? ? ? ? this.obj.set("name","kerwin")

? ? ? ? this.obj.set("age",100)

? ? }

? ? static{

? ? ? ? console.log(this.obj)

? ? }

}

console.log(Cache.obj)

```



?

##### 4. 使用in來判斷某個對象是否擁有某個私有屬性

```js

class Cache {

? ? #obj = {}

? ? get(key) {

? ? ? ? return this.#obj[key]

? ? }

? ? set(key, value) {

? ? ? ? this.#obj[key] = value

? ? }

? ? hasObj(){

? ? ? ? return #obj in this

? ? }

}

let cache = new Cache()

console.log(cache.hasObj())

```



?

##### 5.支持在最外層寫await

> 頂層`await`只能用在 ES6 模塊,不能用在 CommonJS 模塊。這是因為 CommonJS 模塊的`require()`是同步加載,如果有頂層`await`,就沒法處理加載了。

```js

<script type="module">

? ? function ajax() {

? ? return new Promise((resolve) => {

? ? ? ? setTimeout(() => {

? ? ? ? ? ? resolve("data-1111");

? ? ? ? }, 1000);

? ? })

}

let res = await ajax();

console.log(res)

</script>

```



?

##### 6. at函數來索引元素

```js

let arr = ["kerwin","tiechui","gangdan","xiaoming"]

console.log(arr[1])

console.log(arr[arr.length-1]) //變丑了

console.log(arr[arr.length-2]) //變丑了

console.log(arr.at(1))

console.log(arr.at(-1))

console.log(arr.at(-2))

```



?

##### 7. 正則匹配的開始和結束索引

```js

let str = "今天是2022-11-10"

let reg = /(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})/d

//exec

let res = reg.exec(str)

console.log(res)

```

![image-20220927105243515](%E7%AC%94%E8%AE%B0.assets/image-20220927105243515.png)



?

##### 8.findLast()和findLastIndex()函數

```js

let arr = [11,12,13,14,15]

// let res = arr.find(function(value){

// ? return value % 2 === 0

// })

// let res = arr.findIndex(function(value){

// ? return value % 2 === 0

// })

// let res = arr.findLast(function(value){

// ? return value % 2 === 0

// })

let res = arr.findLastIndex(function(value){

? ? return value % 2 === 0

})

console.log(res)

```

##### 9.Error對象的Cause屬性

> Error對象多了一個`cause`屬性來指明錯誤出現的原因。這個屬性可以幫助我們為錯誤添加更多的上下文信息,從而幫助使用者們更好地定位錯誤。

```js

function getData(){

? ? try{

? ? ? ? console.log(kerwin)

? ? }

? ? catch(e){

? ? ? ? throw new Error('New error 1111111',{cause:"這是因為,,,,,,,,,"});

? ? }

}


?

try{

? ? getData()

}catch(e){

? ? console.log(e.cause)

}

```


?

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

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

相關文章

pytorch 筆記:pytorch 優化內容(更新中)

1 Tensor創建類 1.1 直接創建Tensor&#xff0c;而不是從Python或Numpy中轉換 不要使用原生Python或NumPy創建數據&#xff0c;然后將其轉換為torch.Tensor直接用torch.Tensor創建或者直接&#xff1a;torch.empty(), torch.zeros(), torch.full(), torch.ones(), torch.…

樹莓派【Raspberry Pi-64位】3b+,Pi4J 2.0入門

一.前言: 前面的文章講解了樹莓派在centos7 arm64版本下的使用,用一款智能小車為例子,做了代碼實踐。 由于centos7不再維護,且Pi4J 1.x版本也因為WiringPi 的局限,Pi4J從1.x升級為2.x.所以本專欄的技術棧也將進行調整,A.從centos7系統回到Raspberry Pi-64位系統。B.Pi4…

4.通用編程概念

目錄 一、變量與常量1.1 變量1.2 常量 二、遮蔽三、數據類型3.1 標量類型1. 整型2. 浮點型3. 布爾類型4.字符類型 3.2 復合類型1. 元組2. 數組 四、函數五、語句和表達式六、函數的返回值 一、變量與常量 1.1 變量 在Rust中默認的變量是不可變的&#xff0c;如果修改其值會導致…

《青少年編程與數學》課程方案:4、課程策略

《青少年編程與數學》課程方案&#xff1a;4、課程策略 一、工程師思維二、使命感驅動三、價值觀引領四、學習現代化五、工作生活化六、與時代共進 《青少年編程與數學》課程策略強調采用工程師思維&#xff0c;避免重復造輪子&#xff0c;培養使命感&#xff0c;通過探索興趣、…

編程語言有哪些?這些希望你都知道

編程語言有哪些 編程語言有很多種&#xff0c;包括但不限于以下幾種&#xff1a; Java&#xff1a;當今最普遍使用的開發語言之一&#xff0c;簡單易學&#xff0c;且跨平臺性非常強&#xff0c;對網絡開發的支持令人稱贊。Python&#xff1a;語法清楚&#xff0c;干凈&#…

【Vue】如何提供訪問vuex的數據

文章目錄 一、提供數據二、訪問Vuex中的數據通過$store訪問的語法1&#xff09;模板中使用2&#xff09;組件邏輯中使用3&#xff09;js文件中使用 三、通過輔助函數 - mapState獲取 state中的數據 一、提供數據 State提供唯一的公共數據源&#xff0c;所有共享的數據都要統一…

[office] 快速刪除excel中的空行和列的方法 #其他#學習方法#經驗分享

快速刪除excel中的空行和列的方法 用戶在網上下載好的Excel表格打開之后發現有很多空白行&#xff0c;怎么樣將這些空白行或單元格一次性刪除掉呢?下面教大家在Excel中用定位一次性可以把空白行刪除 用戶在網上下載好的Excel表格打開之后發現有很多空白行&#xff0c;怎么樣將…

Vue3 使用audio播放語音+監聽播放語音完成事件

需求&#xff1a;輸入一段文字&#xff0c;點擊語音框&#xff0c;將本地語音&#xff08;提前準備好的&#xff09; 播放出來 播放中效果 代碼 <div class"listConAI" click"handleOpenSpeech" ><imgsrc"../../../../assets/images/blueo…

web前端 孫俏:深度探索與實戰之路

web前端 孫俏&#xff1a;深度探索與實戰之路 在這個數字化、信息化的時代&#xff0c;web前端技術以其獨特的魅力&#xff0c;吸引著越來越多的開發者投身其中。今天&#xff0c;我們將跟隨孫俏的腳步&#xff0c;一同探索web前端的深度與廣度&#xff0c;揭開其神秘的面紗。…

中文文案寫作有哪些合適的AIGC工具?

這是計育韜老師第 8 次開展面向全國高校的新媒體技術公益巡講活動了。而在每場講座尾聲&#xff0c;互動答疑環節往往反映了高校師生當前最普遍的運營困境&#xff0c;特此計老師在現場即興答疑之外&#xff0c;會盡量選擇有較高價值的提問進行文字答疑梳理。 *本輪巡講主題除了…

【Vue】開啟嚴格模式及Vuex的單項數據流

文章目錄 一、引出問題二、開啟嚴格模式 一、引出問題 目標 明確 vuex 同樣遵循單向數據流&#xff0c;組件中不能直接修改倉庫的數據 這樣數據的流向才會更加清晰&#xff0c;將來對數據的修改&#xff0c;都在倉庫內部實現的&#xff0c;更易于維護 直接在組件中修改Vuex中…

Git:版本控制的藝術與GitLab實戰指南

在當今快速發展的軟件開發領域&#xff0c;高效、協同的代碼管理是項目成功的關鍵。Git&#xff0c;作為一款分布式版本控制系統&#xff0c;憑借其強大的功能和靈活性&#xff0c;成為了眾多開發者首選的版本控制工具。本文將帶您深入探索Git的核心概念、基礎操作&#xff0c;…

B3870 [GESP202309 四級] 變長編碼

[GESP202309 四級] 變長編碼 題目描述 小明剛剛學習了三種整數編碼方式&#xff1a;原碼、反碼、補碼&#xff0c;并了解到計算機存儲整數通常使用補碼。但他總是覺得&#xff0c;生活中很少用到 2 31 ? 1 2^{31}-1 231?1 這么大的數&#xff0c;生活中常用的 0 ~ 100 0…

Spring進階技巧:利用AOP提前介入的巧妙實踐

Spring框架中的面向切面編程&#xff08;AOP&#xff09;是一種強大的機制&#xff0c;它允許開發者在不修改原有代碼的情況下&#xff0c;對程序進行橫向切面的功能擴展。AOP提供了一種方式&#xff0c;可以在目標Bean的生命周期早期階段就實施切面邏輯&#xff0c;這為我們在…

Python 中如何使用 lambda 函數

在 Python 中&#xff0c;可以使用 lambda 函數來創建匿名函數。lambda 函數的語法是&#xff1a;lambda 參數: 表達式。以下是一些使用 lambda 函數的例子&#xff1a; 通過 lambda 函數來計算兩個數的和&#xff1a; add lambda x, y: x y print(add(2, 3)) # 輸出 5通過…

Oracle 日志挖掘

oracle 11g 日志挖掘測試 需要開啟補充日志 alter database add supplemental log data; SELECT SUPPLEMENTAL_LOG_DATA_MIN, SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;在用戶下執行一些刪除&#xff0c;插入等操作 SQL> create table zxy( …

LLM評測數據集

1. C-Eval 數據集源地址: C-Eval Official Repository 數據范圍: 該數據集包括學科類知識測試&#xff0c;涵蓋廣泛的學科知識&#xff0c;例如數學、物理、化學等。 數據集大小及數據形式: 數據集包含13,948道單選題&#xff0c;題目均為中文。 論文地址: C-Eval: A Multi-…

【一百一十】【算法分析與設計】[SDOI2009] HH的項鏈,樹狀數組應用,查詢區間的種類數,樹狀數組查詢區間種類數

P1972 [SDOI2009] HH的項鏈 [SDOI2009] HH的項鏈 題目描述 HH 有一串由各種漂亮的貝殼組成的項鏈。HH 相信不同的貝殼會帶來好運&#xff0c;所以每次散步完后&#xff0c;他都會隨意取出一段貝殼&#xff0c;思考它們所表達的含義。HH 不斷地收集新的貝殼&#xff0c;因此&am…

SMS - 基于阿里云實現手機短信驗證碼登錄(無需備案,非測試)

目錄 SMS 環境調試 從阿里云云市場中購買第三方短信服務 調試短信驗證碼功能 實戰開發 封裝組件 對外接口 調用演示 SMS 環境調試 從阿里云云市場中購買第三方短信服務 a&#xff09;進入阿里云首頁&#xff0c;然后從云市場中找到 “短信” &#xff08;一定要從 云…

如何實現網站HTTPS訪問

在當今網絡安全至關重要的時代&#xff0c;HTTPS已經成為網站安全的基本標準。HTTPS&#xff08;超文本傳輸安全協議&#xff09;通過在HTTP協議基礎上加入SSL加密層&#xff0c;確保了數據在用戶瀏覽器和服務器之間的傳輸是加密的&#xff0c;有效防止數據被竊取或篡改&#x…