【JavaWeb13】了解ES6的核心特性,對于提高JavaScript編程效率有哪些潛在影響?

在這里插入圖片描述

文章目錄

    • 🌍一. ES6 新特性
      • ??1. ES6 基本介紹
      • ??2. 基本使用
        • 2.1 let 聲明變量
        • 2.2 const 聲明常量/只讀變量
        • 2.3 解構賦值
        • 2.4 模板字符串
        • 2.5 對象拓展運算符
        • 2.6 箭頭函數
    • 🌍二. Promise
      • ??1. 基本使用
      • ??2. 如何解決回調地獄問題
        • 2.1回調地獄問題
        • 2.2 使用 Promise
        • 2.3Promise 的優勢
    • 🌍三. 模塊化編程
      • ??1. 基本介紹
      • ??2. CommonJS 模塊編程
      • ??3. ES6 模塊編程
        • 1. ES6模塊的關鍵特性
        • 2. 實踐中的注意事項


🙋?♂? 作者:@whisperrr.🙋?♂?

👀 專欄:JavaWeb👀

💥 標題:【JavaWeb13】了解ES6的核心特性,對于提高JavaScript編程效率有哪些潛在影響?💥

?? 寄語:比較是偷走幸福的小偷??

🌍一. ES6 新特性

首先給大家推薦倆個學習ES6的網址。

ECMA International 官方網站:這個網站提供了 ES6 的官方文檔,詳細介紹了 ES6 的所有特性和規范。這是一個權威且詳盡的學習資源,適合那些希望深入了解語言規范的開發者。

  • 網址:https://262.ecma-international.org/6.0/

阮一峰的 ES6 教程:這是由阮一峰編寫的一本關于 ES6 的入門書籍,廣受前端開發者歡迎。這本書以簡單易懂的方式介紹了 ES6 的各種特性,非常適合初學者和希望快速掌握 ES6 的開發者。

  • 網址:https://es6.ruanyifeng.com/#docs/let

??1. ES6 基本介紹

1.ES6 是什么?

  1. ECMAScript 6.0(以下簡稱 ES6)是 JavaScript 語言的下一代標準, 2015 年 6 月發布。
  2. ES6 設計目標:達到 JavaScript 語言可以用來編寫復雜的大型程序,成為企業級開發語言
  3. ECMAScript 和 JavaScript 的關系:ECMAScript 是 JavaScript 的規范/規則,JavaScript 是ECMAScript 的一種實現

??2. 基本使用

2.1 let 聲明變量

在ES6(ECMAScript 2015)中,let 關鍵字被引入用來聲明變量,它的用法與 var 類似,但有以下幾個重要的區別:

  1. 塊級作用域let 聲明的變量只在它所在的代碼塊內有效。
  2. 不存在變量提升let 聲明的變量不會被提升到作用域的頂部。
  3. 暫時性死區:在聲明之前就使用 let 聲明的變量會導致ReferenceError錯誤。

下面是 let 聲明變量的幾種基本用法:

基本聲明

let a;
let b = 10;

塊級作用域示例

if (true) {let message = "Hello, World!";console.log(message); // "Hello, World!"
}
// 在這里訪問 message 會報錯,因為 message 是在 if 塊中聲明的

不存在變量提升

console.log(a); // 報錯:ReferenceError: a is not defined
let a = 'I am not hoisted';

只能聲明一次,

let num2 = 600;
let num2 = 900;

num2已經聲明過了,再次使用let聲明會報錯
Uncaught SyntaxError: redeclaration of let num2

暫時性死區示例

var tmp = 123;
if (true) {tmp = 'abc'; // ReferenceError: Cannot access 'tmp' before initializationlet tmp;
}

在這個例子中,盡管 tmplet tmp; 聲明之前已經被聲明為一個全局變量,但在 let 聲明之前訪問 tmp 會導致錯誤,因為在 if 塊中的 tmp 的暫時性死區內,它還未被聲明。
使用 let 可以幫助避免JavaScript中常見的一些錯誤,并且使得代碼更加安全和易于理解。

2.2 const 聲明常量/只讀變量

在ES6(ECMAScript 2015)中,const 關鍵字用于聲明一個只讀的常量。這意味著一旦一個變量被聲明為常量,它的值就不能再被改變。下面是 const 聲明常量的一些基本用法和規則:

基本聲明

const PI = 3.14159;

常量規則

  1. 必須初始化:聲明一個常量時,必須同時初始化它的值,否則會報錯。
    const FOO; // SyntaxError: Missing initializer in const declaration
    
  2. 不可重新賦值:一旦聲明,常量的值就不能再被改變。
    const MAX_SIZE = 100;
    MAX_SIZE = 200; // TypeError: Assignment to constant variable.
    
2.3 解構賦值

1.基本介紹

  1. 解構賦值是對賦值運算符的擴展
  2. 是一種針對數組或者對象進行模式匹配,然后對其中的變量進行賦值
  3. 主要有兩種形式: 數組解構和對象解構

2.數組解構

ES6(ECMAScript 2016)引入了數組解構(Array Destructuring),它是一種表達式,可以方便地從數組中提取值并賦給變量。數組解構的語法形式是在一個賦值操作符的左側使用一個數組字面量。

以下是數組解構的一些基本用法:

//第一種方式
let arr = [1, 2, 3];
let [a, b, c] = arr;
//第二種方式
let [num1, num2, num3] = [100, 200, 300];

3.對象解構

ES6(ECMAScript 2015)同樣引入了對象解構(Object Destructuring),它允許你將對象中的屬性直接賦值給變量。對象解構的語法是在賦值操作符的左側使用一個對象字面量。

以下是對象解構的一些基本用法:

//第一種方式
let monster = {name: '牛魔王', age: 800};
let {name, age} = monster;
//第二種方式
let {name, age} = {name: '牛魔王', age: 800};//也可以當做形參
function f1({name, age}) {
console.log("f1-name=", name, " ", "f1-age=", age)
}
f1(monster);

1.把 monster 對象的屬性, 賦值給{name,age}
2.{name,age} 的取名 name 和 age 要和 monster 對象的屬性名保持一致
3.使用{} 包括, 不要使用[]
4.{name,age} 順序是無所謂

2.4 模板字符串
  • 模板字符串使用反引號 ` 字符串包裹
  • 可作為普通字符串
  • 可用來定義多行字符串,即可以將換行字符串原生輸出
  • 字符串插入變量和表達式, 使用 ${}
  • 字符串中調用函數
let str1 = `for(int i = 0;i < 10;i++){
System.out.println("i="+i);
}`;let str2 = `教育名稱=${name}`;
let str3 = `1+2=${1 + 2}`;
2.5 對象拓展運算符

對象擴展運算符(Spread Operator),用三個點(…)表示,允許你將一個對象的可枚舉屬性復制到另一個對象中。這在合并對象、傳遞參數等場景中非常有用。

合并對象,你可以使用擴展運算符來合并兩個或多個對象。

const obj1 = { a: 1, b: 2 }; 
const obj2 = { b: 3, c: 4 }; 
const mergedObj = { …obj1, …obj2 }; 
console.log(mergedObj); // { a: 1, b: 3, c: 4 }

在這個例子中,obj2 的屬性 b 覆蓋了 obj1 中的 b 屬性。

2.6 箭頭函數

1.基本介紹

  1. 箭頭函數提供更加簡潔的函數書寫方式。
  2. 基本語法是:(參數列表) => { 函數體 }
  3. 箭頭函數沒有參數或有多個參數,要用 () 括起來,箭頭函數只有一個參數, 可以省略()
  4. 箭頭函數函數體有多行語句,用 {} 包裹起來,表示代碼塊
  5. 函數體只有一行語句,并且需要返回結果時,可以省略 {}, 結果會自動返回
  6. 箭頭函數多用于匿名函數的定義
let f2 = (n, m) => {
var res = 0
for (var i = n; i <= m; i++) {
res += i
}
return res
};

🌍二. Promise

??1. 基本使用

1.Promise 基本介紹

  1. 傳統的 Ajax 異步調用在需要多個操作的時候,會導致多個回調函數嵌套,導致代碼不夠直觀,就是常說的 Callback Hell
  2. 為了解決上述的問題,Promise 對象應運而生,在 EMCAScript 2015 當中已經成為標準
  3. Promise 是異步編程的一種解決方案。
  4. 從語法上說,Promise 是一個對象,從它可以獲取異步操作的消息
  5. 一句話: Promise 是異步編程的一種解決方案, 可以解決傳統 Ajax 回調函數嵌套問題

2.需求分析/圖解

在這里插入圖片描述3.執行效果在這里插入圖片描述

??2. 如何解決回調地獄問題

下面讓我們詳細探討一下如何使用 Promise 來解決傳統 Ajax 請求中的嵌套回調問題。

2.1回調地獄問題

在傳統的異步編程模式中,如果需要按順序執行多個異步操作(比如多個 Ajax 請求),通常會寫出如下嵌套回調的代碼:

// 假設我們使用的是 jQuery 的 $.ajax 方法
$.ajax({url: 'url1',success: function(response1) {// 處理 response1$.ajax({url: 'url2',success: function(response2) {// 處理 response2$.ajax({url: 'url3',success: function(response3) {// 處理 response3// 如果還有更多操作,繼續嵌套...},error: function(error3) {// 處理 error3}});},error: function(error2) {// 處理 error2}});},error: function(error1) {// 處理 error1}
});

這種代碼結構被稱為“回調地獄”,因為隨著異步操作數量的增加,代碼變得越來越難以閱讀和維護。

2.2 使用 Promise

Promise 提供了一種更加優雅的方式來處理異步操作。以下是使用 Promise 改寫上述代碼的步驟:

  1. 創建 Promise 對象:對于每個異步操作,創建一個返回 Promise 對象的函數。
function fetchUrl(url) {return new Promise((resolve, reject) => {$.ajax({url: url,success: function(response) {resolve(response);},error: function(error) {reject(error);}});});
}
  1. 鏈式調用 .then() 方法:使用 .then() 方法來處理每個 Promise 的成功結果,并在每個 .then() 方法中返回一個新的 Promise,以便鏈式調用。
fetchUrl('url1').then(response1 => {// 處理 response1// 可以返回新的 Promise 或值return fetchUrl('url2');}).then(response2 => {// 處理 response2// 繼續返回新的 Promisereturn fetchUrl('url3');}).then(response3 => {// 處理 response3}).catch(error => {// 處理任何在執行過程中出現的錯誤});

在上面的代碼中,每個 fetchUrl 函數調用都返回一個新的 Promise 對象。當這個 Promise 成功解決(resolved)時,.then() 方法會被調用,并傳入解決值。如果 Promise 被拒絕(rejected),.catch() 方法會被調用,并傳入拒絕的原因。

2.3Promise 的優勢
  • 代碼扁平化:Promise 通過鏈式調用來避免嵌套回調,使代碼更加扁平化。
  • 更好的錯誤處理.catch() 方法可以捕獲鏈中任何 Promise 的錯誤,而不是在每個回調中分別處理。
  • 可讀性和可維護性:鏈式調用使得異步代碼的流程更加清晰,易于理解和維護。
    通過使用 Promise,我們可以編寫更加清晰和結構化的異步代碼,避免了回調地獄,并提供了更強大的錯誤處理機制。

🌍三. 模塊化編程

??1. 基本介紹

  1. 傳統非模塊化開發有如下的缺點:(1)命名沖突 (2)文件依賴
  2. Javascript 代碼越來越龐大,Javascript 引入模塊化編程,開發者只需要實現核心的業務邏輯,其他都可以加載別人已經寫好的模塊
  3. Javascript 使用"模塊"(module)的概念來實現模塊化編程, 解決非模塊化編程問題

2.模塊化編程原理示意圖
在這里插入圖片描述

??2. CommonJS 模塊編程

  • 每個 js 文件就是一個模塊,有自己的作用域。在文件中定義的變量、函數、類/對象,都是私有的,對其他 js 文件不可見
  • CommonJS 使用 module.exports={} / exports={}導出 模塊 , 使用 let/const 名稱 =require("xx.js")導入模塊
    在這里插入圖片描述

CommonJS 是一種模塊規范,最初被用于服務器端的 JavaScript 環境,尤其是 Node.js。它定義了一種簡單的方式來創建和消費模塊。以下是 CommonJS 模塊編程的基本概念和用法:

1.模塊定義

在 CommonJS 中,一個模塊是一個文件。模塊可以通過 module.exports 對象來導出值,也可以通過 exports 變量來導出多個成員。以下是導出一個函數的例子:

// myModule.js
function myFunction() {// ...
}
module.exports = myFunction;

或者,如果你想要導出多個函數或對象:

// myModule.js
function myFunction() {// ...
}
function anotherFunction() {// ...
}
exports.myFunction = myFunction;
exports.anotherFunction = anotherFunction;

2.模塊引用
要使用一個模塊,你可以使用 require 函數來引入它。require 函數會返回模塊導出的對象。

// main.js
const myModule = require('./myModule');
myModule.myFunction();

如果模塊導出的是一個函數或單個值,你可以直接使用它:

// main.js
const myFunction = require('./myModule');
myFunction();

3.模塊緩存
Node.js 會緩存通過 require 加載的模塊。這意味著每次調用 require 時,如果模塊已經被加載過,它會返回緩存的模塊,而不是重新加載。

特點

  • 同步加載:CommonJS 模塊是同步加載的,這意味著模塊加載時會阻塞后續代碼的執行,直到模塊加載完成。
  • 循環依賴:CommonJS 可以處理模塊間的循環依賴,但是需要小心處理,因為可能會出現只部分加載的情況。

以下是一個簡單的 CommonJS 模塊化編程的例子:

// math.js
exports.add = function(a, b) {return a + b;
};
exports.subtract = function(a, b) {return a - b;
};
// main.js
const math = require('./math');
console.log(math.add(1, 2)); // 輸出 3
console.log(math.subtract(5, 2)); // 輸出 3

在這個例子中,math.js 模塊導出了兩個函數,main.js 通過 require 引入了這個模塊,并使用了它的功能。
CommonJS 模塊規范在 Node.js 和一些瀏覽器環境中得到了廣泛的支持,但是在瀏覽器環境中,通常使用 ES6 Modules 或 AMD 作為模塊化的解決方案。

??3. ES6 模塊編程

  • ES6 使用
    (1)export {名稱/對象/函數/變量/常量}
    (2) export 定義=
    (3) export default {}導出模塊
  • 使用 import {} from "xx.js" / import名稱 form "xx.js" 導入模塊
    在這里插入圖片描述
    ES6模塊化編程是JavaScript語言的一個重要進步,它為開發者提供了一種官方的、標準化的方式來組織和重用代碼。在此之前,JavaScript社區已經嘗試了多種模塊化方案,如AMD、CommonJS等,但它們都是非標準的,或者在某些環境中有限制。ES6模塊的引入,標志著JavaScript在語言層面上對模塊化的正式支持。
1. ES6模塊的關鍵特性
  1. 導出(Export)與導入(Import)
    ES6模塊通過exportimport關鍵字來管理模塊的對外接口和依賴關系。這使得模塊之間的交互變得直觀且易于理解。你可以導出單個變量、函數、類或者整個模塊對象,也可以導入一個模塊中的特定部分或者整個模塊。
  2. 默認導出(Default Export)
    默認導出允許一個模塊導出一個沒有名字的值,這在使用模塊時提供了更大的靈活性。每個模塊只能有一個默認導出,但可以與多個命名導出共存。
  3. 編譯時加載
    與CommonJS的運行時加載不同,ES6模塊是在編譯時進行加載的。這意味著模塊的依賴關系在代碼執行之前就已經確定,這有助于提高性能并允許進行更多的編譯時優化。
  4. 樹搖(Tree Shaking)
    由于ES6模塊的靜態結構,未使用的導出可以在打包過程中被移除,這個過程被稱為“樹搖”。這有助于減少最終打包文件的體積,提高應用的加載速度。
  5. 命名空間導出(Namespace Export)
    ES6模塊還支持命名空間導出,允許你將多個導出聚合到一個對象中。這對于組織大量導出非常有用,可以避免命名沖突。
2. 實踐中的注意事項
  • 瀏覽器支持:雖然現代瀏覽器支持ES6模塊,但在使用時可能需要設置正確的MIME類型,并在<script>標簽中使用type="module"
  • 服務器端渲染:在Node.js等服務器端環境中,可能需要使用特定的模塊解析策略或轉換工具,如Babel,來兼容ES6模塊。
  • 打包工具:在實際開發中,通常會使用Webpack、Rollup等打包工具來處理模塊依賴,優化生產環境下的代碼。
    ES6模塊化編程不僅提升了代碼的可維護性和可重用性,也為JavaScript的生態系統帶來了標準化和一致性。隨著現代前端框架和工具鏈的發展,ES6模塊已經成為編寫現代JavaScript應用程序的基石。

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

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

相關文章

《幾何原本》命題I.2

《幾何原本》命題I.2 從一個給定的點可以引一條線段等于已知的線段。 設 A A A 為給定點&#xff0c; B C BC BC 為給定線段 連接 A B AB AB&#xff0c;作等邊 △ A B D \triangle ABD △ABD 以 B B B 為圓心&#xff0c; B C BC BC 為半徑作小圓 延長 D B DB DB 交小圓…

java數據結構_Map和Set_9.1

1. 搜索樹 1.1 概念 二叉搜索樹又稱二叉排序樹&#xff0c;它或者是一棵空樹&#xff0c;或者是具有以下性質的二叉樹&#xff1a; 若它的左子樹不為空&#xff0c;則左子樹上所有的結點都小于根結點的值若它的右子樹不為空&#xff0c;則右子樹上所有的結點都大于根結點的值…

Rust Async 并發編程:處理任意數量的 Future 與 Stream

1. Streams&#xff1a;異步數據流 1.1 Streams 與 Iterator 的異同 Rust 的 Iterator 是同步的&#xff0c;通過 next() 方法逐個獲取數據。而 Stream 是 async 版本的 Iterator&#xff0c;它使用 next().await 來獲取數據項。 示例&#xff1a;將 Iterator 轉換為 Stream…

藍橋杯 路徑之謎

路徑之謎 題目描述 小明冒充 XX 星球的騎士&#xff0c;進入了一個奇怪的城堡。 城堡里邊什么都沒有&#xff0c;只有方形石頭鋪成的地面。 假設城堡地面是 nnnn 個方格。如下圖所示。 按習俗&#xff0c;騎士要從西北角走到東南角。可以橫向或縱向移動&#xff0c;但不能斜著走…

3-5 WPS JS宏 工作表的移動與復制學習筆記

************************************************************************************************************** 點擊進入 -我要自學網-國內領先的專業視頻教程學習網站 *******************************************************************************************…

聊聊Java的SPI機制

個人自建博客地址 什么是SPI呢&#xff1f; SPI全稱Service Provider Interface&#xff0c;翻譯過來就是服務提供者接口。調用方提供接口聲明&#xff0c;服務提供方對接口進行實現&#xff0c;提供服務的一種機制&#xff0c;服務提供方往往是第三方或者是外部擴展。 下面…

langchain4j+local-ai小試牛刀

序 本文主要研究一下如何本地運行local-ai并通過langchain4j集成調用。 步驟 curl安裝 curl https://localai.io/install.sh | sh% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed 100 21509 …

什么是“零日漏洞”(Zero-Day Vulnerability)?為何這類攻擊被視為高風險威脅?

正文 零日漏洞&#xff08;Zero-Day Vulnerability&#xff09; 是指軟件、硬件或系統中存在的、尚未被開發者發現或修復的安全漏洞。攻擊者在開發者意識到漏洞存在之前&#xff08;即“零日”內&#xff09;利用該漏洞發起攻擊&#xff0c;因此得名。這類漏洞的“零日”特性使…

鴻蒙 ArkUI 實現 2048 小游戲

2048 是一款經典的益智游戲&#xff0c;玩家通過滑動屏幕合并相同數字的方塊&#xff0c;最終目標是合成數字 2048。本文基于鴻蒙 ArkUI 框架&#xff0c;詳細解析其實現過程&#xff0c;幫助開發者理解如何利用聲明式 UI 和狀態管理構建此類游戲。 一、核心數據結構與狀態管理…

Milvus高性能向量數據庫與大模型結合

Milvus | 高性能向量數據庫&#xff0c;為規模而構建Milvus 是一個為 GenAI 應用構建的開源向量數據庫。使用 pip 安裝&#xff0c;執行高速搜索&#xff0c;并擴展到數十億個向量。https://milvus.io/zh Milvus 是什么&#xff1f; Milvus 是一種高性能、高擴展性的向量數據…

kettle插件-自定義函數-數據脫敏

平常我們在使用kettle抽取數據的時候會涉及到敏感數據邀請脫敏或者進行掩碼的需求&#xff0c;今天我們使用自定義函數插件來實現這些需求。 1、將自定義函數插件&#xff08;kettle-func-plugin.zip&#xff09;解壓后放到kettle的plugins目錄下面&#xff0c;然后重啟服務。…

LeetCode 每日一題 2025/2/24-2025/3/2

記錄了初步解題思路 以及本地實現代碼&#xff1b;并不一定為最優 也希望大家能一起探討 一起進步 目錄 2/24 1656. 設計有序流2/25 2502. 設計內存分配器2/26 1472. 設計瀏覽器歷史記錄2/27 2296. 設計一個文本編輯器2/28 2353. 設計食物評分系統3/1 131. 分割回文串3/2 2/24 …

C++動態與靜態轉換區別詳解

文章目錄 前言一、 類型檢查的時機二、安全性三、適用場景四、代碼示例對比總結 前言 在 C 中&#xff0c;dynamic_cast 和 static_cast 是兩種不同的類型轉換操作符&#xff0c;主要區別體現在類型檢查的時機、安全性和適用場景上。以下是它們的核心區別&#xff1a; 一、 類…

探秘《矩陣之美》:解鎖矩陣的無限魅力

在這個數據驅動的時代&#xff0c;矩陣作為數學中的瑰寶&#xff0c;不僅在理論研究中占據核心地位&#xff0c;更在工程技術、計算機科學、物理學、經濟學等眾多領域發揮著不可替代的作用。今天&#xff0c;讓我們通過中科院大學耿修瑞老師&#xff08;中科院空天信息研究院研…

【MySQL】(2) 庫的操作

SQL 關鍵字&#xff0c;大小寫不敏感。 一、查詢數據庫 show databases; 注意加分號&#xff0c;才算一句結束。 二、創建數據庫 {} 表示必選項&#xff0c;[] 表示可選項&#xff0c;| 表示任選其一。 示例&#xff1a;建議加上 if not exists 選項。 三、字符集編碼和排序…

Vue3實現文件上傳、下載及預覽全流程詳解(含完整接口調用)

文章目錄 一、環境準備1.1 創建Vue3項目1.2 安裝依賴1.3 配置Element Plus 二、文件上傳實現2.1 基礎上傳組件2.2 自定義上傳邏輯&#xff08;Axios實現&#xff09; 三、文件下載實現3.1 直接下載&#xff08;已知文件URL&#xff09;3.2 后端接口下載&#xff08;二進制流&am…

分布式數據存儲:提升系統彈性與性能的技術之路

分布式數據存儲:提升系統彈性與性能的技術之路 在當今數據爆炸式增長的時代,傳統的單機存儲系統已無法滿足大規模、高并發、低延遲的需求。尤其是在大數據、云計算和物聯網的推動下,數據存儲面臨著前所未有的挑戰。分布式數據存儲應運而生,通過將數據分布在多個物理節點上…

在編譯Linux的內核鏡像和模塊時,必須先編譯內核鏡像,再編譯模塊,順序不可隨意調整的原因

問&#xff1a;在編譯Linux的內核鏡像和模塊時,必須先編譯內核鏡像,再編譯模塊,順序不可隨意調整 答&#xff1a;在編譯 Linux 內核和模塊時&#xff0c;必須先編譯內核鏡像&#xff0c;再編譯模塊&#xff0c;順序不可隨意調整。 原因&#xff1a; 模塊依賴內核的頭文件和符…

免費使用 DeepSeek API 教程及資源匯總

免費使用 DeepSeek API 教程及資源匯總 一、DeepSeek API 資源匯總1.1 火山引擎1.2 百度千帆1.3 阿里百煉1.4 騰訊云 二、其他平臺2.1 華為云2.2 硅基流動 三、總結 DeepSeek-R1 作為 2025 年初發布的推理大模型&#xff0c;憑借其卓越的邏輯推理能力和成本優勢&#xff0c;迅速…

千峰React:案例二

完成對html文檔還有css的引入&#xff0c;引入一下數據&#xff1a; import { func } from prop-types import ./購物車樣式.css import axios from axios import { useImmer } from use-immer import { useEffect } from reactfunction Item() {return (<li classNameacti…