ES6 新增 API 方法

ES6 新增 API 方法

目錄

  • ES6 新增 API 方法
    • 背景介紹
    • 數組方法
      • 1. Array.from()
      • 2. Array.of()
      • 3. find/findIndex
      • 4. includes
      • 5. flat/flatMap
    • 對象方法
      • 1. Object.assign()
      • 2. Object.keys/values/entries
      • 3. Object.getOwnPropertyDescriptors()
    • 字符串方法
      • 1. includes/startsWith/endsWith
      • 2. padStart/padEnd
      • 3. repeat
    • 實際應用場景
      • 1. 數據處理
      • 2. 字符串處理
      • 3. 對象操作
    • 最佳實踐
    • 面試常見問題及參考答案

背景介紹

ECMAScript 6(簡稱 ES6)于 2015 年發布,帶來了 JavaScript 語言的重大更新。ES6 引入了眾多新特性和 API 方法,使 JavaScript 代碼更加簡潔、高效和易于維護。這些新增 API 極大地簡化了開發流程,提高了代碼質量,成為現代 JavaScript 開發的基礎。

數組方法

1. Array.from()

// 類數組轉數組
const arrayLike = { 0: 'a', 1: 'b', 2: 'c', length: 3 }
const arr = Array.from(arrayLike)
console.log(arr) // ['a', 'b', 'c']// 帶映射功能
const numbers = Array.from([1, 2, 3], x => x * 2)
console.log(numbers) // [2, 4, 6]// Set轉數組
const set = new Set(['a', 'b', 'c'])
const arrFromSet = Array.from(set)
console.log(arrFromSet) // ['a', 'b', 'c']

2. Array.of()

// 創建數組
const arr1 = Array.of(7)
console.log(arr1) // [7]const arr2 = Array.of(1, 2, 3)
console.log(arr2) // [1, 2, 3]// 對比Array構造函數
const arr3 = new Array(7)
console.log(arr3) // [empty × 7]

3. find/findIndex

const numbers = [1, 2, 3, 4, 5]// find
const found = numbers.find(num => num > 3)
console.log(found) // 4// findIndex
const foundIndex = numbers.findIndex(num => num > 3)
console.log(foundIndex) // 3// 找不到時的返回值
const notFound = numbers.find(num => num > 10)
console.log(notFound) // undefinedconst notFoundIndex = numbers.findIndex(num => num > 10)
console.log(notFoundIndex) // -1

4. includes

const array = [1, 2, 3, NaN]// 基本使用
console.log(array.includes(2)) // true
console.log(array.includes(4)) // false// 從指定位置開始查找
console.log(array.includes(1, 1)) // false// 可以查找NaN
console.log(array.includes(NaN)) // true

5. flat/flatMap

// flat
const nested = [1, [2, 3], [4, [5, 6]]]
console.log(nested.flat()) // [1, 2, 3, 4, [5, 6]]
console.log(nested.flat(2)) // [1, 2, 3, 4, 5, 6]// flatMap
const sentences = ['Hello world', 'Good morning']
const words = sentences.flatMap(s => s.split(' '))
console.log(words) // ['Hello', 'world', 'Good', 'morning']

對象方法

1. Object.assign()

// 對象合并
const target = { a: 1 }
const source1 = { b: 2 }
const source2 = { c: 3 }
const result = Object.assign(target, source1, source2)
console.log(result) // { a: 1, b: 2, c: 3 }// 淺拷貝
const original = { a: 1, b: { c: 2 } }
const copy = Object.assign({}, original)
console.log(copy) // { a: 1, b: { c: 2 } }

2. Object.keys/values/entries

const obj = { a: 1, b: 2, c: 3 }// Object.keys()
console.log(Object.keys(obj)) // ['a', 'b', 'c']// Object.values()
console.log(Object.values(obj)) // [1, 2, 3]// Object.entries()
console.log(Object.entries(obj)) // [['a', 1], ['b', 2], ['c', 3]]// 實際應用
Object.entries(obj).forEach(([key, value]) => {console.log(`${key}: ${value}`)
})

3. Object.getOwnPropertyDescriptors()

const obj = {get foo() {return 'foo'},
}// 獲取完整的屬性描述符
console.log(Object.getOwnPropertyDescriptors(obj))
// {
//   foo: {
//     get: [Function: get foo],
//     set: undefined,
//     enumerable: true,
//     configurable: true
//   }
// }// 創建帶有getter/setter的對象副本
const clone = Object.defineProperties({}, Object.getOwnPropertyDescriptors(obj))

字符串方法

1. includes/startsWith/endsWith

const str = 'Hello world'// includes
console.log(str.includes('world')) // true
console.log(str.includes('World')) // false// startsWith
console.log(str.startsWith('Hello')) // true
console.log(str.startsWith('hello')) // false// endsWith
console.log(str.endsWith('world')) // true
console.log(str.endsWith('World')) // false

2. padStart/padEnd

// 補全字符串長度
console.log('1'.padStart(3, '0')) // '001'
console.log('1'.padEnd(3, '0')) // '100'// 常見應用:格式化日期
const month = '5'
const day = '3'
const formattedDate = `${month.padStart(2, '0')}/${day.padStart(2, '0')}` // "05/03"

3. repeat

// 重復字符串
console.log('ha'.repeat(3)) // 'hahaha'// 實際應用:生成縮進
function indent(level) {return ' '.repeat(level * 2)
}

實際應用場景

1. 數據處理

// 數組去重
const unique = Array.from(new Set([1, 1, 2, 2, 3]))// 數據轉換
const prices = Object.entries(data).map(([key, value]) => ({item: key,price: value,
}))

2. 字符串處理

// 格式化顯示
function formatNumber(num) {return String(num).padStart(6, '0')
}// 檢查文件類型
function isImageFile(filename) {return filename.toLowerCase().endsWith('.jpg') || filename.toLowerCase().endsWith('.png')
}

3. 對象操作

// 配置合并
const defaultConfig = { timeout: 1000, retry: 3 }
const userConfig = { timeout: 2000 }
const config = Object.assign({}, defaultConfig, userConfig)

最佳實踐

  1. 數組方法使用建議

    • 優先使用新方法代替傳統實現
    • 注意方法的返回值和副作用
    • 合理使用鏈式調用
  2. 對象方法使用建議

    • 使用 Object.assign 進行淺拷貝
    • 使用 entries 進行對象遍歷
    • 注意屬性描述符的處理
  3. 字符串方法使用建議

    • 使用新方法提高代碼可讀性
    • 注意大小寫敏感性
    • 合理使用字符串填充功能

面試常見問題及參考答案

  1. Array.from 和擴展運算符的區別是什么?

    參考答案:Array.from 和擴展運算符(…)都可以將類數組對象或可迭代對象轉換為數組,但有以下區別:

    • Array.from 可以接受第二個參數(映射函數),類似于 map 功能
    • Array.from 能處理的范圍更廣,可以處理有 length 屬性的普通對象
    • 擴展運算符只能處理可迭代對象(實現了 Iterator 接口)
    • 性能上,一般來說擴展運算符在處理可迭代對象時略快
  2. Object.assign 實現深拷貝需要注意什么?

    參考答案:Object.assign 本身只實現淺拷貝,要實現深拷貝需注意:

    • Object.assign 只會復制屬性值,如果屬性是對象引用,只會復制引用而非對象本身
    • 要實現深拷貝,可以遞歸處理嵌套對象
    • 可以使用 JSON.parse(JSON.stringify(obj)) 簡單實現深拷貝,但這種方法不能處理函數、循環引用、特殊對象(如 Date、RegExp)等
    • 更復雜場景應使用專門的深拷貝庫,如 lodash 的_.cloneDeep()方法
  3. 如何判斷一個值在數組中的存在?includes 和 indexOf 的區別?

    參考答案:判斷值是否在數組中存在的方法有:

    • includes:返回布爾值,能正確處理 NaN
    • indexOf:返回索引或-1,不能處理 NaN
    • some:可以用自定義條件判斷

    主要區別:

    • includes 語義更清晰,直接返回 true/false
    • includes 可以查找 NaN,而 indexOf 不能
    • indexOf 可以精確知道元素位置,includes 不能
    • 對于大型數組,性能基本相當
  4. flat 和 flatMap 的使用場景是什么?

    參考答案:

    • flat 適用于:

      • 扁平化嵌套數組結構
      • 清理數組中的空項(holes)
      • 可以指定扁平化深度
    • flatMap 適用于:

      • 處理需要先映射(map)再扁平化的場景
      • 文本處理,如分詞、過濾空值
      • 替代常見的 map 后 flat 的鏈式調用,提高性能
      • 生成一對多的數據映射
  5. Object.entries 的實際應用有哪些?

    參考答案:Object.entries 的實際應用包括:

    • 遍歷對象鍵值,比 Object.keys 更直接
    • 將對象轉換為 Map: new Map(Object.entries(obj))
    • 對象的序列化和轉換
    • 實現對象的過濾和轉換,如創建新對象時篩選特定屬性
    • 對象排序:先轉 entries,排序后再轉回對象
  6. 新增的字符串方法有什么優勢?

    參考答案:ES6 新增字符串方法的優勢:

    • 語義化更強:如 includes 比 indexOf 返回-1 更直觀
    • 功能更專一:startsWith/endsWith 替代 indexOf+復雜判斷
    • 簡化常見操作:padStart/padEnd 處理格式化,repeat 處理重復
    • 提高代碼可讀性:減少了冗長的條件判斷和手動實現
    • 性能優化:原生方法通常比自定義實現更高效
  7. 如何選擇合適的 API 方法?

    參考答案:選擇合適的 API 方法應考慮:

    • 功能需求:優先選擇專為特定功能設計的 API
    • 語義清晰度:選擇能表達代碼意圖的方法
    • 瀏覽器兼容性:考慮目標環境是否支持,是否需要 polyfill
    • 性能因素:在性能關鍵場景,選擇最優性能的方法
    • 代碼一致性:保持項目中 API 使用的一致風格
    • 團隊熟悉度:考慮團隊對 API 的理解程度

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

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

相關文章

vscode使用ssh鏈接服務器

vscode SSH vscode先下載remote ssh的插件,隨后在左邊的菜單欄里選擇遠程。 點擊新建連接,輸入用戶名和地址,-p參數指定端口 ssh ubuntu{ip} -p xxx 隨后就可以正常連接了,這里使用普通用戶的用戶名密碼,別用root。 配…

基于FPGA的電子萬年歷系統開發,包含各模塊testbench

目錄 1.課題概述 2.系統仿真結果 3.核心程序與模型 4.系統原理簡介 5.完整工程文件 1.課題概述 基于FPGA的電子萬年歷系統開發,包含各模塊testbench。主要包含以下核心模塊: 時鐘控制模塊:提供系統基準時鐘和計時功能。 日歷計算模塊&#xff1a…

C++ 的 out_ptr 和 inout_ptr

1 問題的起因 1.1 T** 或 T&* ? C 的智能指針可以通過 get() 和 * 的重載得到原始指針 T*&#xff0c;遇到這樣的 C 風格的函數的時候&#xff1a; void Process(Foo *ptr);std::unique_ptr<Foo> sp ...;Process(sp.get()); //調用 Process 函數Process() 函數以…

取消 Conda 默認進入 Base 環境

在安裝 Conda 后&#xff0c;每次打開終端時默認會進入 base 環境。可以通過以下方法取消這一默認設置。 方法一&#xff1a;使用命令行修改配置 在終端中輸入以下命令&#xff0c;將 auto_activate_base 參數設置為 false&#xff1a; conda config --set auto_activate_ba…

數字計數--數位dp

1.不考慮前導零 2.每一位計數&#xff0c;就是有點“數頁碼”的意思 P2602 [ZJOI2010] 數字計數 - 洛谷 相關題目&#xff1a;記得加上前導零 數頁碼--數位dp-CSDN博客 https://blog.csdn.net/2301_80422662/article/details/148160086?spm1011.2124.3001.6209 #include…

Redis學習打卡-Day5-Redis 持久化

單點 Redis 的一些問題 數據丟失&#xff1a;Redis 是內存存儲&#xff0c;服務重啟可能會丟失數據。solution&#xff1a;實現 Redis 數據持久化。并發能力&#xff1a;單節點 Redis 并發能力雖然不錯&#xff0c;但也無法滿足如618這樣的高并發場景。solution&#xff1a;搭…

飛書知識問答深度體驗:企業AI應用落地的典范產品

飛書知識問答深度體驗&#xff1a;企業AI應用落地的典范產品 產品介紹-飛書知識問答是什么與常規通用大模型相比有何優點&#xff1f;大模型橫行的時代&#xff0c;飛書知識問答對普通人和企業有何影響呢&#xff1f; 場景示例-不同角色可以用飛書知識問答做什么&#xff1f;對…

Python打卡訓練營學習記錄Day34

知識點回歸&#xff1a; CPU性能的查看&#xff1a;看架構代際、核心數、線程數 GPU性能的查看&#xff1a;看顯存、看級別、看架構代際 GPU訓練的方法&#xff1a;數據和模型移動到GPU device上 類的call方法&#xff1a;為什么定義前向傳播時可以直接寫作self.fc1(x) CPU性…

Django的請求和響應+template模板

&#x1f31f; 如果這篇文章觸動了你的心弦&#xff0c;請不要吝嗇你的支持&#xff01; 親愛的讀者&#xff0c; 感謝你花時間閱讀這篇分享。希望這里的每一個字都能為你帶來啟發或是讓你會心一笑。如果你覺得這篇文章有價值&#xff0c;或者它解決了你一直以來的一個疑問&a…

Python |GIF 解析與構建(2):狀態機解析

Python &#xff5c;GIF 解析與構建&#xff08;2&#xff09;&#xff1a;狀態機解析 目錄 Python &#xff5c;GIF 解析與構建&#xff08;2&#xff09;&#xff1a;狀態機解析 引言 一、狀態機概述 狀態機的優勢與改進方向 總結 引言 在《Python &#xff5c;GIF 解…

PCB設計實踐(二十六)貼片電容與插件電容的全面解析:差異、演進與應用場景

一、核心差異&#xff1a;結構與性能對比 物理結構與封裝形式 貼片電容&#xff08;Surface Mount Device, SMD&#xff09;采用扁平化設計&#xff0c;外形多為長方體或圓柱體&#xff0c;直接通過焊盤固定在電路板表面。其封裝材料通常為陶瓷、聚合物或鋁電解層&#xff0c;外…

XC7A200T-2FFG1156I FPGA AMD Xilinx Artix-7

XC7A200T-2FFG1156I 是 AMD Xilinx Artix-7 系列的一款高性能低功耗 FPGA&#xff0c;采用 28 nm 高性能低功耗&#xff08;HPL&#xff09;工藝制造&#xff0c;核心電壓在 0.95 V–1.05 V 之間&#xff0c;可在 –40 C 至 100 C 工業溫度范圍內穩定工作 。 邏輯資源&#xff…

LVS + Keepalived + Nginx 高可用負載均衡系統實驗

1. 項目背景 在現代 Web 應用中&#xff0c;高可用性和負載均衡是至關重要的需求。本項目旨在通過 LVS&#xff08;Linux Virtual Server&#xff09;實現流量分發&#xff0c;通過 Keepalived 實現高可用性&#xff0c;通過 Nginx 提供后端服務。該架構能夠確保在單點故障的情…

window 顯示驅動開發-視頻內存供應和回收(一)

Windows 顯示驅動程序模型 (WDDM) 1.2 及更高版本用戶模式顯示驅動程序必須使用內存套餐和回收功能&#xff08;從Windows 8開始提供&#xff09;&#xff0c;以減少本地內存和系統內存中臨時表面所需的內存開銷。 最低 WDDM 版本&#xff1a;1.2 最低 Windows 版本&#xff…

什么是VR場景?VR與3D漫游到底有什么區別

在數字化時代&#xff0c;虛擬現實&#xff08;Virtual Reality, 簡稱VR&#xff09;場景與3D漫游作為兩種前沿技術&#xff0c;改變著人們的生活方式和體驗模式。通過計算機模擬真實或假想的場景&#xff0c;讓用戶仿佛身臨其境&#xff0c;并能與虛擬環境進行互動。盡管VR場景…

JAVA查漏補缺(2)

AJAX 什么是Ajax Ajax&#xff08;Asynchronous Javascript And XML&#xff09;&#xff0c;即是異步的JavaScript和XML&#xff0c;Ajax其實就是瀏覽器與服務器之間的一種異步通信方式 異步的JavaScript 它可以異步地向服務器發送請求&#xff0c;在等待響應的過程中&…

客服中心大模型應用演進路線:從傳統服務到超級智能助手的轉型

客服中心作為企業與客戶溝通的重要橋梁&#xff0c;近年來經歷了從人工服務到人工智能驅動的深刻變革。本文基于"客服中心大模型應用演進路線圖"&#xff0c;詳細解析客服中心從傳統模式向AI驅動智能服務的轉型歷程&#xff0c;剖析每個發展階段的特點、應用場景及關…

使用 OpenCV 實現“隨機鏡面墻”——多鏡片密鋪的哈哈鏡效果

1. 引言 “哈哈鏡”是一種典型的圖像變形效果&#xff0c;通過局部鏡面反射產生扭曲的視覺趣味。在計算機視覺和圖像處理領域&#xff0c;這類效果不僅有趣&#xff0c;還能用于藝術創作、交互裝置、視覺特效等場景。 傳統的“哈哈鏡”往往是針對整張圖像做某種鏡像或扭曲變換…

Python訓練營打卡——DAY33(2025.5.22)

目錄 簡單的神經網絡 一、PyTorch的安裝 二、準備工作 三、數據的準備 四、模型架構定義 五、模型訓練&#xff08;CPU版本&#xff09; 1. 定義損失函數和優化器 2. 開始循環訓練 3. 可視化結果 六、通俗解釋 1. 環境安裝&#xff08;相當于買鍋碗瓢盆&#xff09;…

目標檢測 Lite-DETR(2023)詳細解讀

文章目錄 迭代高級特征跨尺度融合高效的低層次特征跨尺度融合KDA&#xff1a;Key-aware Deformable Attention 論文翻譯&#xff1a; CVPR 2023 | Lite DETR&#xff1a;計算量減少60%&#xff01;高效交錯多尺度編碼器-CSDN博客 DINO團隊的 &#xff08;Lightweight Transfo…