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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…