浅谈ES标准的演变

news/2024/5/19 12:04:43/文章来源:https://blog.csdn.net/shushanfx/article/details/128178185

ECMAScript从1997年第一版诞生依赖,经过无数人的“踩坑”和“填坑”,到现在,ES12呼之欲出。那么我们不妨讨论一下ES的发展历程,看它如何统一江湖,看它“曲折”而又令人期待的发展之路。

最近分析typescript,其中tsconfig.json有一个配置项target,其值如下:
指定ECMAScript目标版本 "ES3"(默认)、 "ES5""ES6""ES2015""ES2016""ES2017""ESNext"
注意: "ESNext"最新的生成目标列表为 ES proposed features

如此,按照严谨性的原则,我们查询一下每个target值之间的差异。

历史进程

在这里插入图片描述
上图按照时间顺序说明了JavaScript、JScript和ECMAScript的发展。
显示在网景工作的Brendan Eich临危受命,用十天时间设计出LiveScript的第一个版本。临时发布前为了讨好Sun公司和Java程序员,LiveScript改名为JavaScript。
微软这边不甘示弱,你的浏览器有脚本功能,我的浏览器也要有啊。于是在IE3.0版本附带退出JScript。为什么叫JScript?因为JavaScript已经被网景公司注册,微软作为一个商业公司必须用一个新的名字。
这下可苦了网页开发者了,虽然两个浏览器都支持脚本,但是两种脚本语法和功能都有区别,一个网页难道要写两套脚本?
一直致力于指定消费电子标准的ECMA组织,审时度势,觉得有必要把网页脚本的语法和功能统一一下,预时发布ECMAScript标准(第一版)。之后对该标准进行了一些修改,更新到ECMAScript3(以下简称ES3)。
所以说ECMAScript是这种网页脚本的标准,而JavaScript和JScript则是ECMAScript的两种实现。
此后的浏览器厂商都尽量依据ES3来实现自己的脚本语言。如IE8中的JScript5.8、Firefox中的JavaScript1.5,都是兼容ES3标准的。
从上图你会发现,之后的9年(2000-2009),ES没有任何升级。期间的ES4居然被放弃了。具体原因博友们可以去查一下资料。直到2009年,ES5横空出世,同年,前端界也出了一个大事件——Node.js发布。Node.js是一个基于Google Chrome的V8引擎(2008年发布)的JS运行环境。
从这一年开始,前端火了。
因为JS跳出了浏览器,可以在任何地方运行了。前端工程师被浏览器禁锢的创造力,如雨后春笋般爆发。
JS维持了几年的高速增长后,大家发现JS语言本身,已经不适应他的发展速度了,于是ES的更新越来越快,2015年发布ES6,2016年的ES7直接更名为ES2016,你猜对了,以后ES说不定会每年更新一次了……
后续: ES2017、ES2018陆续出现,在许多产商的共同努力一下,兼容ECMA逐渐成为共识。

ECMA的版本差异

如上所述,说起ES的标准不得不提ECMA-262规范,前两个版本更新尚算给力,进入版本3之后,版本4莫名夭折,终于在2009年等来版本5,之后进入6年的沉寂,终于在2015年,在千呼万唤中ES6正式发布。ES6的到来为JS的发展带来众多特性,同时也开启了ES版本发展的新纪元。下面,我列举了ECMA的发展历程:

版本时间描述别名下载地址
ECMA-262 1st edition1997-06第一版发版PDF
ECMA-262 2nd edition1998-08PDF
ECMA-262 3rd edition1999-12第三版发布,几乎所有浏览器都兼容该版本ES3PDF
ECMA-262 4th edition-实际并未存在,就其原因可以参考【原因分析】原因分析
ECMA-262 5th edition2009-12版本5ES5PDF
ECMA-262 5.1th edition2011-06版本5.1ES5.1PDF
ECMA-262 6th edition2015-06版本6ES6PDF
ECMA-262 7th edition2016-06版本7,从此版本开始又称ES2016,并规定每年一发版。ES7 ES2016PDF
ECMA-262 8th edition2017-06ES2017ES8PDF
ECMA-262 9th edition2018-06ES2018ES9PDF
ECMA-262 10th edition2019-06ES2019ES10PDF
ECMA-262 11th edition2020-06ES2020ES11PDF
ECMA-262 12th edition2021-06ES2021ES12PDF(https://www.ecma-international.org/wp-content/uploads/ECMA-262_12th_edition_june_2021.pdf)
ECMA-262 13th edition-ES2022ES13提案中

可以发现,从ES6开始,ECMA的规范发展明显加快,并基本保持一年一个版本的趋势(每年6月)。

接下来,我们分析一下每个版本的变化。ES1-2太多久远,关注意义不大,我直接从ES3开始。

ES3

ES属于标准统一阶段,基本上将之前的实现统一,特定如下:
1) regular expressions 正则表达式
2) better string handling 字符串处理
3) new control statements 新的控制语句
4) try/catch exception handling try/catch 异常处理
5) tighter definition of errors 错误定义
6) formatting

ES5

  1. 属性和值的定义的变化
    增加了Object.defineProperty,支持writable、enumerate、configurable、deletable,同时支持getter和setter方法。
    还包括:

    • Object.defineProperties(obj, propName, descriptorSet)
    • Object.create(protoObj, descriptorSet)
    • Object.getOwnPropertyNames(obj)
    • Object.Prototype
    • Object.getPrototypeOf(obj)
    • Object.getOwnPropertyDescriptor
    • Object.getOwnPropertyNames
    • Object.preventExtensions
    • Object.isExtensible(obj)
    • Object.seal
    • Object.isSealed(obj)
    • Object.freeze
    • Object.isFrozen(obj)
    • Object.keys

    所以抱怨IE不支持Vue的同学可以了解,defineProperty在ES5中才引入,而IE低版本只支持到ES3。

  2. Function变化

    the value of ‘this’ will not be changed when calling ‘.call()’ or ‘.apply()’
    ‘null’ and ‘undefined’ will not be returned to global
    a non-object will not be switched to an object
    new method Bind. This bind method allows the user to set up the value of this and apply the value to the function.

    由此我们可以看出,主要的变化是增加bind函数,如下:

    var name = 'shushanfx';
    var obj = { name: 'Alex' };
    function getName() {return this.name
    }
    var func2 = getName.bind(obj);
    console.info(getName());     // 输出 shushanfx
    console.info(func2());       // 输出 Alex
    

    此处需要注意,对于低版本浏览器, ES5并没有全面支持,所以使用bind等函数需要加polyfill。

  3. Array
    增加了一些数组的方法,如下:
    • Array.prototype.indexOf
    • Array.prototype.lastIndexOf
    • Array.prototype.every
    • Array.prototype.some
    • Array.prototype.forEach
    • Array.prototype.map
    • Array.prototype.filter
    • Array.prototype.reduce
    • Array.prototype.reduceRight

  4. JSON
    增加了JSON对象,并提供了JSON.parse和JSON.stringify两个对象
    JSON.stringify() → string
    JSON.parse() → value

  5. strict mode
    引入strict mode,错误的赋值语句将报错。详细的严格模式定义如下:

    • 全局变量显式声明,必须先声明再使用;
    • 静态绑定
      • 禁用with语句
      • 创设eval作用域
    • 增强的安全措施
      • 禁止this关键字指向全局对象
      • 禁止在函数内部遍历调用栈
    • 禁止删除变量,除非显式的标记为可删除
    • 显式报错
    • 重名错误
      • 对象不能有重名的属性
      • 函数不能有重名的参数
    • 禁止八进制表示法
    • arguments对象的限制
      • 不允许对arguments赋值
      • arguments不再追踪参数的变化
      • 禁止使用arguments.callee
    • 函数必须声明在顶层
    • 保留字

ES6

ES6应该是js的跨时代的更新,它的出现,解决了ES5长久积累的问题,也为js的发展带来的新的希望。特性如下:

  • let 定义以及块作用域
  • 箭头函数
  • for…of 循环
  • generators函数
  • class定义
  • Promise引入
  • 参数扩展,如默认值、剩余参数、扩展操作符
  • 字符串占位符
  • Object 属性扩展,属性定义简写、计算属性支持、方法属性支持;
  • 赋值语句扩展
    • 数组赋值
    • 对象赋值
    • 参数赋值
    • 多重赋值
  • 模块
    • export、import支持
    • default关键字
  • Symbol
  • Map、Set & WeakMap、WeakSet
  • Typed Arrays
  • 方法扩展
    • Object.assign
    • Array.prototype.find Array.prototype.findIndex
    • String.protype.repeat
    • String.protype.startsWith endsWith includes
    • Number.isNaN isFinite isSafeInteger
    • Math.trunc 去尾
    • Math.sign 获取函数符号
  • Proxy
  • Reflect
  • Internationalization & Localization
    • 数字
    • 货币
    • 日期

ES7(ES2016)

TC39,作为ECMAScript的执行委员会,决定从ES7开始,决定每年发布一版本。

  • Array.prototype.inclues
  • ** 操作符(平方)

ES8 (ES2017)

改动如下:

  • Object.entries
  • Object.values
  • String Padding: String.prototype.padStart String.protype.padEnd
  • Object.getOwnPropertyDescriptors
  • 函数参数支持末尾增加逗号(trailing comma)
  • Async functions

注意: async function是ES8才正式加上的,也就是说在这之前,async函数均会以语法糖的形式编译成另外一种形式。具体可以参加async编译后的产物

ES9(ES2018)

  • Spread properties to Object
    在这里插入图片描述
  • Asynchronous Iteration
  • Promise.prototype.finally
  • 正则表达式增强
    • s模式
    • 命名分组
      在这里插入图片描述
    • 前置条件
      在这里插入图片描述

ES10(ES2019)

  • Array.prototype.flat
    在这里插入图片描述
  • Array.prototype.flatMap
    在这里插入图片描述
  • Object.fromEntries() 从entries中复制一个对象
    在这里插入图片描述
  • String.prototype.trimStart、String.prototype.trimEnd
    在这里插入图片描述
  • try/catch不需要捕获e
    在这里插入图片描述
  • Function.prototype.toString优化,可以获取更加格式化的信息
    在这里插入图片描述
  • Symbol.prototype.description,增加只读属性description
    在这里插入图片描述
  • JSON.stringify优化,增加对unicode的处理
    在这里插入图片描述
  • Array.prototype.sort排序方式修改,改成TimSort
    10以上使用快排,10以下使用插入排序

ES2020

待补充

ES2021

待补充

小结

从1997年发布至今,经历20多年的发展,ES标准逐步完善。同时随着nodejs的兴起,物联网端的应用,es标准将会被更多厂商采用,js开发最好的时代正在向你走来。适当的了解一下ES标准,有助于js的学习,如果时间充裕的话,强烈建议大家去阅读ECMA-262标准文档,相信会受益良多。

参考文档

  1. javascript严格模式详解: https://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html
  2. ECMAScript3 VS ECMAScript5 http://www.jiehuang.net/wordPress/uncategorized/ecmascript/
  3. New Features of ECMAScript 2017: https://lethalbrains.com/new-features-of-ecmascript-2017-c25a9db5f5e0?gi=17dbf351b3a5
  4. New ES2018 Features: https://css-tricks.com/new-es2018-features-every-javascript-developer-should-know/
  5. What’s New in ECMAScript
    2019: https://selvaganesh93.medium.com/javascript-whats-new-in-ecmascript-2019-es2019-es10-35210c6e7f4b
  6. ECMA历史记录: https://www.ecma-international.org/publications-and-standards/standards/ecma-262/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_230655.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsp网络申报审批系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 网络申报审批系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用…

16S全长测序揭示绿头虻肠道微生物及共生细菌

论文题目:Greenhead (Tabanus nigrovittatus) Wolbachia and Its Microbiome: A Preliminary Study 期刊:Microbiol Spectrum 研究背景 绿头虻(Tabanus nigrovittatus)的雌虫刺吸牲畜的血液,危害家畜,是美…

【从零开始学习深度学习】6.使用torchvision下载与查看图像分类数据集Fashion-MNIST

目录1.1 获取Fashion-MNIST数据集2.2 读取小批量小结图像分类数据集中最常用的是手写数字识别数据集MNIST。但大部分模型在MNIST上的分类精度都超过了95%。为了更直观地观察算法之间的差异,我们将使用一个图像内容更加复杂的数据集Fashion-MNIST。 本节我们将使用to…

分享几款免费实用的国产内网穿透工具

对于没有公网IP的用户来说,如何实现远程管理或让局域网的服务可以被公网访问到是一个问题。当然,也有很多类似的需求,比如: 微信公众号小程序开发调试公网访问本地web项目异地远程处理公司服务问题异地访问公司内网财务/管理系统…

什么是代码签名证书?

使用代码签名证书,您可以保证签名者的身份和软件的完整性,这可以防止在下载和安装软件时出现警告。 代码签名证书是软件开发人员用来签署其软件、应用程序和驱动程序代码的数字证书。它使用公私密钥基础设施(PKI)将实体绑定到公钥和私钥。 申请代码签名…

好用的数据恢复软件EasyRecovery2023最新版

实用的数据恢复软件有什么?电脑中的数据文件对很多的小伙伴来说都是非常重要的,在下载安装新的软件设备时都需要非常谨慎,一旦碰到一些病毒就可能会导致文件丢失,想要恢复这些文件并不是很容易,需要使用专业的数据恢复…

西部学刊杂志西部学刊杂志社西部学刊编辑部2022年第22期目录

百年党建与马克思主义中国化研究 党的纪律建设的实践、启示与创新——基于“三大纪律八项注意”的研究 武艳; 5-8 西部研究《西部学刊》投稿:cn7kantougao163.com 新疆红色资源运用现状调查研究——以南疆部分地区为例 王艺潼;努尔古扎丽阿不都克里木; 9-12…

毕业设计-基于机器视觉的深蹲检测识别-TensorFlow-opencv

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

Flink

文章目录1. 概述1.1 Apache Flink1.2 特点1.3 Flink VS Spark Streaming2. 安装与部署2. Flink运行时的组件2.1 作业管理器(JobManager)2.2 任务管理器(TaskManager)2.3 资源管理器(ResourceManager)2.4 分发器(Dispatcher)3. 任务提交流程4. Flink API4.1 不用级别…

红石外汇|每日汇评:在中国重新开放和OPEC+的推动下,欧元受到高度关注

1、本周开始欧元再次上涨,而美元则暴跌; 2、积极的美国就业数据和OPEC稳定的产量提升为经济回升提供前景; 3、市场对中国重新开放的渴望可能很快就会实现; 今天,由于美元再次面临压力,欧元兑美元在亚盘市…

window和linux的nacos安装

Nacos注册中心 Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高 Nacos的下载 在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码: …

代码随想录刷题Day55 | 392. 判断子序列 | 115. 不同的子序列

代码随想录刷题Day55 | 392. 判断子序列 | 115. 不同的子序列 392. 判断子序列 题目: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形…

闲人闲谈PS之三十六——项目状态控制

**惯例闲话:**最近感觉时间不够用,脑子有很多想法,但是到下笔却感觉总是下不了手,写完一段,感觉和自己想的差距很大,然后有全部删除…这难道就是传说中年纪大了,手脚不停使唤…这让闲人更加焦虑…

SSM框架学习记录-Spring_day02

1.IOC/DI配置管理第三方bean 之前都是基于自己写的类,如果有需求去管理第三方Jar包中的类,该如何管理? 案例:数据源对象管理 使用Spring的IOC容器来管理Druid连接池对象 思路分析 要使用第三方的技术,需要在pom.xml添加依赖 在配置文件中将…

简单学校网页设计作业 静态HTML校园博客主页 DW大学网站模板下载 大学生简单我的学校网页作品代码 个人网页制作 学生个人网页设计作业

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

Linux——网络配置(重点)

目录 一、查看网络IP和网关 1.1 那怎么看连接成功呢? 1.1.1 虚拟机接受主机 1.1.2 主机可以接收到虚拟机 1.2 怎么查看电脑的IP地址 方法一: 方法二: 1.3 怎么查看虚拟机的IP地址 二、网络连接模式 2.1 基本了解 2.2 VMware三种网络…

etcd实现大规模服务治理应用实战

导读:服务治理目前越来越被企业建设所重视,特别现在云原生,微服务等各种技术被更多的企业所应用,本文内容是百度小程序团队基于大模型服务治理实战经验的一些总结,同时结合当前较火的分布式开源kv产品etcd,…

【NC65】主子表单据按照单表结构展现 节点客开

需求描述: 需要将【采购入库】按照【采购订单关闭】节点的形式展现数据。 客开思路: 功能注册增加功能节点,(40080603)勾选启用。菜单注册增加 菜单 并关联 功能节点(40080603)。初始化 单据模板,查询模板采购入库单主子表汇总VO是PurchaseInViewVO ,系统里其他单据节点 …

【NLP】自然语言处理的语料库与词库

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

Spring框架(十二):实现日志功能通过SpringBean后处理器

实现日志功能通过SpringBean后处理器引子需求分析实现Log功能Spring Bean的后置处理器引子 痛定思痛,主要问题出现在自己雀氏不熟悉框架底层、一些面试题,以及sql的一些情况淡忘了。 本章节的开始是对于过去的重新回顾,当然,我也…