ES6 新增 API 方法示例详解

 更新时间:2025年05月27日 09:37:26   作者:超级土豆粉  
ES6 引入了众多新特性和 API 方法,使 JavaScript 代码更加简洁、高效和易于维护,这些新增 API 极大地简化了开发流程,提高了代码质量,成为现代 JavaScript 开发的基础,这篇文章给大家介绍ES6新增API方法,感兴趣的朋友跟随小编一起看看吧

ES6 新增 API 方法

背景介绍

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) // undefined
const 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)

最佳实践

数组方法使用建议

  • 优先使用新方法代替传统实现
  • 注意方法的返回值和副作用
  • 合理使用链式调用

对象方法使用建议

  • 使用 Object.assign 进行浅拷贝
  • 使用 entries 进行对象遍历
  • 注意属性描述符的处理

字符串方法使用建议

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

Array.from 和扩展运算符的区别是什么?

参考答案:Array.from 和扩展运算符(…)都可以将类数组对象或可迭代对象转换为数组,但有以下区别:

  • Array.from 可以接受第二个参数(映射函数),类似于 map 功能
  • Array.from 能处理的范围更广,可以处理有 length 属性的普通对象
  • 扩展运算符只能处理可迭代对象(实现了 Iterator 接口)
  • 性能上,一般来说扩展运算符在处理可迭代对象时略快

Object.assign 实现深拷贝需要注意什么?

参考答案:Object.assign 本身只实现浅拷贝,要实现深拷贝需注意:

  • Object.assign 只会复制属性值,如果属性是对象引用,只会复制引用而非对象本身
  • 要实现深拷贝,可以递归处理嵌套对象
  • 可以使用 JSON.parse(JSON.stringify(obj)) 简单实现深拷贝,但这种方法不能处理函数、循环引用、特殊对象(如 Date、RegExp)等
  • 更复杂场景应使用专门的深拷贝库,如 lodash 的_.cloneDeep()方法

如何判断一个值在数组中的存在?includes 和 indexOf 的区别?

参考答案:判断值是否在数组中存在的方法有:

  • includes:返回布尔值,能正确处理 NaN
  • indexOf:返回索引或-1,不能处理 NaN
  • some:可以用自定义条件判断

主要区别:

  • includes 语义更清晰,直接返回 true/false
  • includes 可以查找 NaN,而 indexOf 不能
  • indexOf 可以精确知道元素位置,includes 不能
  • 对于大型数组,性能基本相当

flat 和 flatMap 的使用场景是什么?

参考答案:

  • flat 适用于:

    • 扁平化嵌套数组结构
    • 清理数组中的空项(holes)
    • 可以指定扁平化深度
  • flatMap 适用于:

    • 处理需要先映射(map)再扁平化的场景
    • 文本处理,如分词、过滤空值
    • 替代常见的 map 后 flat 的链式调用,提高性能
    • 生成一对多的数据映射

Object.entries 的实际应用有哪些?

参考答案:Object.entries 的实际应用包括:

  • 遍历对象键值,比 Object.keys 更直接
  • 将对象转换为 Map: new Map(Object.entries(obj))
  • 对象的序列化和转换
  • 实现对象的过滤和转换,如创建新对象时筛选特定属性
  • 对象排序:先转 entries,排序后再转回对象

新增的字符串方法有什么优势?

参考答案:ES6 新增字符串方法的优势:

  • 语义化更强:如 includes 比 indexOf 返回-1 更直观
  • 功能更专一:startsWith/endsWith 替代 indexOf+复杂判断
  • 简化常见操作:padStart/padEnd 处理格式化,repeat 处理重复
  • 提高代码可读性:减少了冗长的条件判断和手动实现
  • 性能优化:原生方法通常比自定义实现更高效

如何选择合适的 API 方法?

参考答案:选择合适的 API 方法应考虑:

  • 功能需求:优先选择专为特定功能设计的 API
  • 语义清晰度:选择能表达代码意图的方法
  • 浏览器兼容性:考虑目标环境是否支持,是否需要 polyfill
  • 性能因素:在性能关键场景,选择最优性能的方法
  • 代码一致性:保持项目中 API 使用的一致风格
  • 团队熟悉度:考虑团队对 API 的理解程度

到此这篇关于ES6 新增 API 方法的文章就介绍到这了,更多相关ES6 新增 API 方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript 的setTimeout与事件循环机制event-loop

    JavaScript 的setTimeout与事件循环机制event-loop

    这篇文章主要介绍了JavaScript 的setTimeout与事件循环机制event-loop,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • js不能获取隐藏的div的宽度只能先显示后获取

    js不能获取隐藏的div的宽度只能先显示后获取

    js不能获取隐藏div的的宽度,现在的办法是先将其显示出来,再获取其宽度,计算位置,下面的示例,大家可以参考下
    2014-09-09
  • javascript+canvas制作九宫格小程序

    javascript+canvas制作九宫格小程序

    这篇文章主要介绍了javascript+canvas制作九宫格小程序,效果非常棒,这里推荐给有需要的小伙伴们
    2014-12-12
  • JS跨域交互(jQuery+php)之jsonp使用心得

    JS跨域交互(jQuery+php)之jsonp使用心得

    JSON是一种基于文本的数据交换方式,或者叫做数据描述格式,这篇文章主要介绍了JS跨域交互(jQuery+php)之jsonp使用心得的相关资料,非常不错,具有参考借鉴价值,需要的朋友一起学习吧
    2016-07-07
  • JS简单获取日期相差天数的方法

    JS简单获取日期相差天数的方法

    这篇文章主要介绍了JS简单获取日期相差天数的方法,涉及javascript日期时间的转换与运算相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • JavaScript基于libgif.js实现控制gif动画帧

    JavaScript基于libgif.js实现控制gif动画帧

    这篇文章主要为大家详细介绍了JavaScript如何利用libgif.js插件控制gif动画帧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • 分享两段简单的JS代码防止SQL注入

    分享两段简单的JS代码防止SQL注入

    下面小编就为大家分享两段简单的JS代码防止SQL注入。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-04-04
  • webpack如何自动生成网站图标详解

    webpack如何自动生成网站图标详解

    这篇文章主要给大家介绍了关于webpack如何自动生成网站图标的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • 微信小程序scroll-view实现自定义滚动条

    微信小程序scroll-view实现自定义滚动条

    这篇文章主要为大家详细介绍了微信小程序scroll-view实现自定义滚动条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Ajax同步与异步传输的示例代码

    Ajax同步与异步传输的示例代码

    这篇文章主要是对Ajax同步与异步传输的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11

最新评论