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

又到一年年终啦,我也浅浅总结下项目经常用到的ES7及以后版本的核心新特性,码友友们,这些你都知道吗

自ES6(ECMAScript 2015)带来大规模语法革新后,ECMAScript标准开启了每年迭代的节奏,从ES7(2016)开始,每个版本都聚焦于实用小特性的补充与优化,逐步解决开发者在日常编码中的痛点。本文将从ES7出发,逐一拆解后续主流版本的核心新特性,结合代码示例说明其用法与优势,助力码友们快速上手现代JavaScript。

一、ES7(ECMAScript 2016)—— 轻量实用的特性补充

ES7作为ES6后的首个小版本更新,仅引入了两个核心特性,但均大幅提升了编码效率。

  1. Array.prototype.includes()数组包含检测

在此之前,检测数组是否包含某个元素需依赖indexOf(),但该方法存在明显缺陷:无法正确检测NaN,且返回索引值需手动判断是否为-1,可读性较差。includes()方法完美解决了这些问题,直接返回布尔值,语义更清晰。

// 基本用法
const arr = [1, 2, 3, NaN]; console.log(arr.includes(2)); // true console.log(arr.includes(NaN)); // true(indexOf会返回-1,无法检测)

// 可选参数:指定查找起始索引
console.log(arr.includes(1, 1)); // false(从索引1开始查找,无1)

优势:语义化更强,兼容NaN检测,代码更简洁直观。

  1. 指数运算符(**)-项目中很少用到

用于实现幂运算,替代传统的 Math.pow()方法,语法更简洁,支持连续运算。

// 基本幂运算
console.log(2 ** 3); // 8,等价于Math.pow(2, 3) console.log(5 ** 2); // 25

// 连续幂运算
console.log(2 ** 3 ** 2); // 512,等价于2^(3^2),而非(2^3)^2 console.log(Math.pow(Math.pow(2, 3), 2)); // 64(与连续运算优先级不同)

注意:指数运算符的优先级高于乘法和除法,低于括号,连续运算时从右往左执行。

二、ES8(ECMAScript 2017)—— 对象与异步能力增强

ES8围绕对象操作、字符串处理和异步编程进行了优化,其中async/await彻底改变了异步代码的编写方式。

  1. Object.values()Object.entries()

这两个方法简化了对象的遍历操作,分别用于获取对象的“值数组”和“键值对数组”,配合数组方法使用更高效。

const obj = { name: '张三', age: 24, gender: '男' };

// Object.values():获取值数组
console.log(Object.values(obj)); // ["张三", 24, "男"]

// Object.entries():获取键值对数组,可直接用于for…of遍历
for (const [key, value] of Object.entries(obj)) { console.log(${key}: ${value}); }
// 输出: // name: 张三 // age: 24 // gender: 男

2.String.prototype.padStart()/padEnd()

用于字符串补全,在字符串开头或结尾填充指定字符,直到达到目标长度,常用于格式化场景(如时间补零、编号对齐)。

// padStart(目标长度, 填充字符):开头补全
console.log('5'.padStart(2, '0')); // "05"(时间格式化常用) console.log('abc'.padStart(5, '-')); // "--abc"

// padEnd(目标长度, 填充字符):结尾补全
console.log('abc'.padEnd(5, 'x')); // "abcxx" console.log('123'.padEnd(6)); // "123 "(默认填充空格)

  1. async/await异步编程语法糖

基于Promise封装,将异步代码转化为“同步”写法,彻底告别回调地狱,可读性和可维护性大幅提升。

// 模拟异步请求
function fetchData(url) { return new Promise((resolve) => { setTimeout(() => { resolve(来自${url}的数据); }, 1000); }); }

// 使用async/await编写异步代码
async function getData() { try { const data1 = await fetchData('https://api.url1.com'); console.log(data1); // 1秒后输出:来自https://api.url1.com的数据 const data2 = await fetchData('https://api.url2.com'); console.log(data2); // 再等1秒输出:来自https://api.url2.com的数据 } catch (error) { console.error('请求失败:', error); } }

getData();

优势:错误捕获更直观(try/catch),代码逻辑与同步代码一致,便于调试。

三、ES9(ECMAScript 2018)—— 迭代与正则增强

  1. 异步迭代(for-await-of
    支持遍历异步数据源(如异步生成器、返回Promise的数组),自动等待每个异步操作完成后再继续遍历。

// 异步生成器
async function* asyncGenerator() { yield fetchData('url1'); yield fetchData('url2'); yield fetchData('url3'); }

// 异步迭代
async function processAsyncData() { for await (const data of asyncGenerator()) { console.log(data); // 依次输出3个请求的数据,每个间隔1秒 } }

  1. 对象展开/剩余属性(…)

ES6的扩展运算符仅支持数组,ES9将其扩展到对象,实现对象的浅拷贝、合并和属性过滤。

// 对象合并(浅拷贝)
const obj1 = { a: 1, b: 2 }; const obj2 = { ...obj1, c: 3, b: 4 }; // 重复属性后者覆盖前者 console.log(obj2); // { a: 1, b: 4, c: 3 }

// 剩余属性:提取未解构的属性
const { a, ...rest } = obj2; console.log(rest); // { b: 4, c: 3 }

  1. 正则表达式增强
  • 命名捕获组:给正则捕获组命名,通过 groups 属性获取对应值,可读性更强。

  • 反向断言:支持正向/反向断言,匹配指定内容前后的字符(不包含断言本身)。

// 命名捕获组:匹配日期(年-月-日)
const dateReg = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; const match = '2026-01-19'.match(dateReg); console.log(match.groups); // { year: "2026", month: "01", day: "19" }

// 反向断言:匹配¥后的数字(不包含¥)
const priceReg = /(?<=¥)\d+/; console.log('商品价格:¥99'.match(priceReg)[0]); // "99"

四、ES10(ECMAScript 2019)—— 数组与对象工具优化

  1. Array.prototype.flat()/flatMap()

用于数组扁平化,flat() 可指定扁平化深度,flatMap() 等价于先执行map() 再执行 flat(1)。

// flat():数组扁平化
const nestedArr = [1, [2, [3, 4], 5]]; console.log(nestedArr.flat()); // [1, 2, [3, 4], 5](默认深度1) console.log(nestedArr.flat(2)); // [1, 2, 3, 4, 5](深度2,完全扁平化)

// flatMap():map+flat(1)
const arr = [1, 2, 3]; console.log(arr.flatMap(x => [x, x*2])); // [1, 2, 2, 4, 3, 6]

  1. Object.fromEntries()

将键值对数组转为对象,是Object.entries()的逆操作,常用于数据格式转换。

const entries = [['name', '李四'], ['age', 28], ['gender', '女']]; const obj = Object.fromEntries(entries); console.log(obj); // { name: "李四", age: 28, gender: "女" }

// 实际场景:将Map转为对象
const map = new Map(entries); console.log(Object.fromEntries(map)); // 同上

五、ES11(ECMAScript 2020)—— 安全访问与性能提升

  1. 可选链运算符(?.

解决嵌套对象属性访问时的“Cannot read property 'x' of undefined”错误,当中间属性为null/undefined时,直接返回undefined

const user = { name: '王五', address: { city: '北京' } };

// 传统写法:需层层判断
const city1 = user && user.address && user.address.city;

// 可选链写法:简洁安全
const city2 = user?.address?.city;
const zipCode = user?.address?.zipCode; // undefined(无该属性,不报错)

  1. 空值合并运算符(??)

用于设置默认值,仅当左侧值为null/undefined时才返回右侧值,区别于 ||(会忽略0、‘’、false等假值)。

// 空值合并运算符
const score1 = 0 ?? 60; // 0(左侧为0,非null/undefined,返回本身)
const score2 = null ?? 60; // 60(左侧为null,返回右侧)

// 对比逻辑或运算符
const score3 = 0 || 60; // 60(0被视为假值,返回右侧)

六、总结与兼容建议

ES7及以后的版本迭代,核心是“实用化”和“简洁化”,通过语法糖减少冗余代码,提升开发效率,同时解决异步编程、数据处理等场景的痛点。这些特性已被现代浏览器和Node.js广泛支持,实际开发中可通过以下方式保障兼容:

  1. 使用Babel转译:将高版本ES语法转为ES5,兼容旧环境。

  2. 借助Polyfill:如core-js,补充低版本环境缺失的API。

  3. 针对性兼容:对无需兼容旧浏览器的项目(如内部系统),可直接使用最新特性。

掌握这些新特性,能让我们的JavaScript代码更简洁、高效、易维护,紧跟前端技术迭代的步伐。

http://www.jsqmd.com/news/268732/

相关文章:

  • 【Java开发】gRPC协议原理剖析及其在微服务架构中的应用
  • 深度剖析eBPF技术原理及其在微服务网关性能优化中的实践应用
  • 打工人救星!用doocs md写公众号必搭cpolar,再也不用卡局域网里改稿了
  • GBase8s集合类型之关联数组简介
  • GBase 8a 参数gcluster_shrink_to_rebalance使用介绍
  • 帝国CMS搭建全攻略:从安装到优化
  • GBase 8c数据库磁盘故障定位技术分享
  • 852-017500-003-6-C220ASSEMBLY CHASSIS 14 英寸屏幕LAM
  • Windows版本的Dify平台搭建
  • Sanyo Denki PU0A030EMA1S00 伺服放大器
  • 便携式半实物测试平台 ETest_PT
  • 2026年Highcharts迎来系列更新| V12.5 正式发布
  • GBase 8c数据库运维——常见故障定位手段 分享
  • Flutter 又迎大坑修改?iOS 26 键盘变化可能带来大量底层改动
  • 3C电子电爪的“心脏”:满足各行各业高精度需求的电爪厂家推荐 - 品牌2025
  • 易语言开发从入门到精通:26+27章实战复盘·全栈知识体系地图·终身学习资源库·个人成长与中文编程传承指南
  • 企业微信API开发:外部群主动推送场景
  • 文献阅读6
  • 基于 API 体系的外部群消息推送“避坑”指南
  • 高口碑电爪品牌推荐:厂商的竞争格局与技术专利 - 品牌2025
  • 2025免费调研平台技术对比:海量模板+智能分析全场景解决方案 - 品牌排行榜
  • 国内iPaaS主流厂商推荐哪家好(最新专业深度测评)
  • 【Python程序开发系列】对象存储服务AWS S3以及使用示例(案例分析)
  • 【飞腾平台实时Linux方案系列】第十一篇 - 飞腾平台电力行业实时控制方案设计。
  • 日程5
  • 2026年精密钢管/热轧无缝管/结构用碳钢无缝管厂家权威榜单:专注工业传输与机械制造,多场景管材解决方案供应
  • 如何开通快捷支付?
  • 探索稿定设计:专业封面模板与便捷在线制作体验
  • 如何建设一个高质量官网?建设企业网站常见问题集锦
  • 解构AIGC落地困局:低代码如何成为普惠AI的技术桥梁