当前位置: 首页 > news >正文

ES10(ES2019)新特性完整指南

ES10(ES2019)新特性

发布时间:2019年6月
ES10 新增了数组扁平化、对象转换、字符串修剪等实用方法。


1. Array.prototype.flat()

将嵌套数组"拉平",返回一个新数组:

基本用法

[1,2,[3,4]].flat();// [1, 2, 3, 4][1,2,[3,[4,5]]].flat();// [1, 2, 3, [4, 5]],默认只拉平一层[1,2,[3,[4,5]]].flat(2);// [1, 2, 3, 4, 5],拉平两层

使用 Infinity 拉平任意深度

[1,[2,[3,[4,[5]]]]].flat(Infinity);// [1, 2, 3, 4, 5]

实际应用

// 从多层嵌套中提取值letdata=[[1,2],[3,4],[5,6]];data.flat();// [1, 2, 3, 4, 5, 6]// 清除数组空位[1,,3,,5].flat();// [1, 3, 5]// 树形数据提取 IDlettree=[{id:1,children:[{id:2},{id:3}]},{id:4,children:[]}];letids=tree.flatMap(node=>[node.id,...node.children.map(c=>c.id)]);// [1, 2, 3, 4]

注意

  • 空位会被自动跳过
  • 超过4层嵌套时建议用Infinity

2. Array.prototype.flatMap()

先执行map()再执行flat(),效率更高:

[1,2,3].flatMap(x=>[x,x*2]);// [1, 2, 2, 4, 3, 6]// 等同于[1,2,3].map(x=>[x,x*2]).flat();

与 map + flat 的区别

// map + flat:可以指定 flat 深度[1,[2,[3]]].map(x=>x).flat(2);// [1, 2, 3]// flatMap:只能拉平一层[1,[2,[3]]].flatMap(x=>x);// [1, 2, [3]]

实际应用

// 将句子拆分为单词数组letsentences=["Hello World","Good Morning"];letwords=sentences.flatMap(s=>s.split(' '));// ['Hello', 'World', 'Good', 'Morning']// 一对多映射letusers=[{name:'张三',hobbies:['篮球','游泳']},{name:'李四',hobbies:['足球']}];lethobbies=users.flatMap(u=>u.hobbies);// ['篮球', '游泳', '足球']// 过滤 + 映射一步完成[1,2,3,4].flatMap(x=>x>2?[x]:[]);// [3, 4]

3. Object.fromEntries()

将键值对列表转为对象,是Object.entries()的逆操作:

// entries:对象 → 键值对数组letentries=Object.entries({a:1,b:2});// [['a', 1], ['b', 2]]// fromEntries:键值对数组 → 对象letobj=Object.fromEntries(entries);// { a: 1, b: 2 }

实际应用

过滤对象属性
letobj={a:1,b:2,c:3,d:4};letfiltered=Object.fromEntries(Object.entries(obj).filter(([k,v])=>v>2));// { c: 3, d: 4 }
映射对象值
letprices={apple:5,banana:3,orange:4};letdoubled=Object.fromEntries(Object.entries(prices).map(([k,v])=>[k,v*2]));// { apple: 10, banana: 6, orange: 8 }
转换 Map 为对象
letmap=newMap([['a',1],['b',2]]);letobj=Object.fromEntries(map);// { a: 1, b: 2 }
URL 参数处理
letparams=newURLSearchParams('name=张三&age=18');letobj=Object.fromEntries(params);// { name: '张三', age: '18' }

4. String.prototype.trimStart()

去除字符串开头的空白字符:

' hello world '.trimStart();// 'hello world '' hello world '.trimLeft();// 'hello world '(别名)

去除的字符

  • 空格、制表符\t、换行符\n、回车符\r

5. String.prototype.trimEnd()

去除字符串末尾的空白字符:

' hello world '.trimEnd();// ' hello world'' hello world '.trimRight();// ' hello world'(别名)

对比 trim()

' hello '.trim();// 'hello'(两端都去)' hello '.trimStart();// 'hello '(只去开头)' hello '.trimEnd();// ' hello'(只去末尾)

6. 可选的 catch 绑定(Optional catch binding)

catch参数可以省略:

// 旧写法:必须写参数try{JSON.parse('invalid');}catch(err){console.log('出错了');}// ES10 新写法:可以省略参数try{JSON.parse('invalid');}catch{console.log('出错了');}

使用场景

当不需要使用错误对象时:

functionparseJSON(str){try{returnJSON.parse(str);}catch{returnnull;// 不需要错误信息,返回默认值}}

7. Symbol.prototype.description

获取 Symbol 的描述字符串:

lets1=Symbol('hello');s1.description;// 'hello'lets2=Symbol('');s2.description;// ''lets3=Symbol();s3.description;// undefinedlets4=Symbol('你好');s4.description;// '你好'

对比 toString()

lets=Symbol('test');s.toString();// 'Symbol(test)'s.description;// 'test'(只返回描述,不带 Symbol())

8. JSON superset(JSON 超集)

ES10 允许在 JSON 字符串中使用 U+2028(行分隔符)和 U+2029(段分隔符):

// ES9 及之前,这两个字符在字符串中会导致语法错误// ES10 修复了这个问题constjson='"\u2028"';JSON.parse(json);// ES10 中正常工作

这个改动是内部修复,对日常开发感知不强。


9. Function.prototype.toString() 修订

toString()返回函数的源代码,包括注释和空格:

functionhello(){/* 注释 */return'world';}console.log(hello.toString());// 输出完整的函数源码,包括注释// "function hello() {\n /* 注释 */\n return 'world';\n}"

10. Array.prototype.sort() 稳定性

ES10 规范要求Array.sort()必须是稳定排序:

letitems=[{name:'A',order:1},{name:'B',order:1},{name:'C',order:2}];// 稳定排序:相同 order 的元素保持原始顺序items.sort((a,b)=>a.order-b.order);// A 仍在 B 前面(保持原始相对顺序)

总结

特性说明重要性
Array.flat()数组扁平化⭐⭐⭐⭐
Array.flatMap()map + flat 组合⭐⭐⭐⭐
Object.fromEntries()键值对数组转对象⭐⭐⭐⭐
String.trimStart()去除开头空白⭐⭐⭐
String.trimEnd()去除末尾空白⭐⭐⭐
可选 catch 绑定catch 可省略参数⭐⭐⭐
Symbol.description获取 Symbol 描述⭐⭐
JSON 超集支持行分隔符
Function.toString()返回完整源码
稳定排序sort 保证稳定性⭐⭐
ject.fromEntries()`键值对数组转对象⭐⭐⭐⭐
String.trimStart()去除开头空白⭐⭐⭐
String.trimEnd()去除末尾空白⭐⭐⭐
可选 catch 绑定catch 可省略参数⭐⭐⭐
Symbol.description获取 Symbol 描述⭐⭐
JSON 超集支持行分隔符
Function.toString()返回完整源码
稳定排序sort 保证稳定性⭐⭐
http://www.jsqmd.com/news/562255/

相关文章:

  • 2026年AI论文工具终极测评:8款神器实测,免费生成万字初稿与真实引用 - 沁言学术
  • 20254122洛桑平措《Python程序设计》实验1报告
  • Arduino NB-IoT库microgear-nbiot接入NETPIE平台指南
  • V2EX GAE 用户系统详解:从注册登录到权限管理的完整实现
  • Django CORS Headers终极配置指南:Vue、React、Angular前端框架完美集成方案
  • 深夜赶稿不再怕:2026年AI论文写作工具横向测评与核心推荐 - 沁言学术
  • WPS加载项开发实战:从零到一构建你的第一个wpsjs插件
  • 2026年AI论文写作工具深度评测:研究生全流程提效,谁才是中文学术最优解? - 沁言学术
  • GLM-OCR快速上手:开箱即用的专业级OCR服务部署指南
  • Wan2.2-I2V-A14B绿色AI实践:显存优化降低35%功耗的碳足迹测算
  • 2026年进口热销品加盟代理有哪些,保健食品加盟/保健食品集合店/大牌热销品/大牌保健食品,进口热销品供应商推荐 - 品牌推荐师
  • 计算机论文急救指南:2026年五大AI写作助手实测与避坑攻略 - 沁言学术
  • 研究生急需的6款免费AI论文工具:1天完成综述,参考文献真实可靠 - 沁言学术
  • 音频工程师必看:奈奎斯特采样定理在实际录音中的5个常见误区
  • 半导体行业展会有哪些?汇总2026年半导体行业精选展会 - 品牌2026
  • RTX 4090D专用镜像应用场景:文生视频模型Wan2.2-T2V本地化部署全流程
  • CPUDoc:解锁CPU隐藏性能的智能优化工具
  • 三步突破语音克隆音质瓶颈:VoxCPM ZipEnhancer全解析
  • AI应用到具体的业务场景:电商物流费用计算
  • MaixCAM图像处理避坑指南:从文件加载到屏幕显示的5个常见错误
  • 灵感画廊部署教程:华为云ModelArts Notebook环境适配要点
  • FFCreator 10个实用技巧:轻松掌握视频制作的核心功能
  • 如何快速开发RPCS3游戏模组:从自定义内容创建到发布的完整指南
  • 百考通:AI全流程智能化赋能答辩PPT,让学术展示更高效从容
  • 2026年免费AI论文工具终极测评:计算机学生如何高效产出万字优质初稿? - 沁言学术
  • ml-glossary生成模型解析:VAE、GAN和自编码器完全指南
  • open-parse部署指南:从开发到生产环境的完整流程
  • Confluence高危漏洞(CVE-2022-26134)应急响应指南:排查、加固与后门清理实操
  • 百考通:AI全流程智能化赋能期刊论文写作,让学术创作更高效
  • 别再自己造轮子了!STM32F103 RTC时间戳转换,用标准库<time.h>更香(附完整代码)