ES3到ES5再到ES6,整理JS语法知识
ES3诞生
1995年5月,Brendan Eich只用了10天设计完成了JS的第一版。
1997年7月,ECMAScript 1.0发布。
1998年6月,ECMAScript 2.0版发布。
1999年12月,ECMAScript 3.0版发布,成为JavaScript的通行标准,得到了广泛支持。
ES3语法有来源
以下几点来自阮一峰博客《JavaScript语言的历史》:
基本语法:借鉴C语言和Java语言。
数据结构:借鉴Java语言,包括将值分成原始值和对象两大类。
函数的用法:借鉴Scheme语言和Awk语言,将函数当作第一等公民,并引入闭包。
原型继承模型:借鉴Self语言(Smalltalk的一种变种)。
正则表达式:借鉴Perl语言。
字符串和数组处理:借鉴Python语言。
这里面最核心的语法是函数和原型。我们来看MDN上ES的介绍。
JavaScript ( JS ) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。——MDN上介绍JS的第一句话
函数优先也叫函数当作第一等公民,指函数可以作为变量、参数、返回值,极大的增加了程序的灵活性。我愿称其为ES的核心特性。
JavaScript 是一种基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。——MDN上介绍JS的另一句非常核心的话。
原型也是ES非常重要的特性。我们再来看看语法们怎样支撑其编程风格的。
ES3支持的编程风格
ES可以写出的编程风格,大体分三个:
命令式的编程风格:基础语法和数据结构让ES有了命令式的编程风格。
函数式编程风格:函数的用法,借鉴的Scheme语言是函数式语言,也使ES有了声明式(如函数式编程)风格。
面向对象风格:原型继承模型。借鉴Self语言是一种简化的面向对象语言,不用搞复杂的类型系统,对象之间通过原型链就可以达到继承效果。让ES有了基于原型的面向对象风格。
ES3的不足
本来想着总结些ES3的不足,引出ES5来弥补这些不足,总结的过程中发觉不是ES3不好了,是互联网发展了,需求变了,对ES提出了更多的要求,ES需要做些改变,以适应当时的环境而已。
比如ES3中声明变量,都是奔着怎么声明都不报错的方向设计的。
ES5
ES5诞生
2009年12月,ECMAScript 5.0版正式发布。
2011年6月,ECMAscript 5.1版发布,并且成为ISO国际标准。
新增内容
严格模式
在此之前,ES本着即使有语法错误也尽量不报错,让用户看到页面就行。随着ES在浏览器中扮演的戏份越来越重,如果不能正确运行ES,网页功能无法正常运行,严格模式就很有必要了。
严格模式使我们更容易编写“安全的” JavaScript。
JSON转化
JSON是Douglas Crockford在2001年开始推广使用的数据格式,在2005年-2006年正式成为主流的数据格式,雅虎和谷歌就在那时候开始广泛地使用JSON格式。
随着JSON成为主流的服务器客户端交互的数据格式,ES支持JSON转化就顺理成章了。
JSON.parse():将文本转换为 JavaScript 对象。
JSON.stringify():将JavaScript 对象转换为字符串。
属性 Getter 和 Setter
这是面向对象思想的产物,封装对象的普通属性。
var person = { firstName: "Bill", lastName : "Gates", get fullName() { return this.firstName + " " + this.lastName; } }; // 使用 getter 来显示来自对象的数据: document.getElementById("demo").innerHTML = person.fullName; 复制代码
Object.defineProperty() 方法也可用于添加 Getter 和 Setter。
内置对象添加方法
我们来看看ES5的内置对象新增的方法:
// 对象 Object.getPrototypeOf, Object.getOwnPropertyDescriptor, Object.getOwnPropertyNames, Object.create, Object.defineProperty, Object.defineProperties, Object.seal, Object.freeze, Object.preventExtensions, Object.isSealed, Object.isFrozen, Object.isExtensible, Object.keys, // 方法 Function.prototype.bind, // 数组,增强了ES处理数组的能力 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, // 字符串 String.prototype.trim, // 日期 Date.now, Date.prototype.toISOString, Date.prototype.toJSON. 复制代码
这里面有代表意义的方法:
Object.create(): 创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。这个方法使构造原型链变得简单,不用依赖于构造函数。
Object.defineProperty(object, property, descriptor):为对象添加或更改对象属性。这个方法在Vue2中被用来做数据劫持,定义数据的getter/setter,非常好用。
ES6
ES6诞生
2015年6月,ECMA标准化组织正式批准了ECMAScript 6语言标准,定名为《ECMAScript 2015 标准》。JavaScript语言正式进入了下一个阶段,成为一种企业级的、开发大规模应用的语言。
一般ES6也泛指最新一代的ES,ES6之后都是些小更新。
我们从四个方面来看ES6升级了什么。
1.声明与表达式
增加了let、const声明变量:在块级作用域有效。
解构赋值:非常适合从复杂对象的取值的场景。
Symbol: 新增的原始数据类型,最大的用法是用来定义对象的唯一属性名。
BigInt:新增的原始数据类型,用来表示Number表达不了的大数。
2.内置对象
ES5就对内置对象做了一些扩展,添加了一些方法,ES6进一步扩展。
字符串扩展:增加方法includes() startsWith() endsWith(),还新增了模版字符串。
数值扩展:Number上增加了属性和方法, Math 对象上新增了 17 个数学相关的静态方法。
Number.EPSILON 属性表示 1 与大于 1 的最小浮点数之间的差。
Number.MAX_SAFE_INTEGER/Number.MIN_SAFE_INTEGER 最大/最小安全数
Number.isFinite():一个数值是否有限。
Number.parseInt():将给定字符串转化为指定进制的整数。
对象扩展:对象字面量的一些简写方式、拓展运算符、新方法Object.assign、Object.is。
数组扩展:新增方法 Array.of() Array.from() find() findIndex() fill() copyWithin() entries() keys() values() includes() flat() flatMap()
新增Map和Set:Map 对象保存键值对,Set 对象允许你存储任何类型的唯一值。
新增Proxy和Reflect:Proxy 与 Reflect 是 ES6 为了操作对象引入的 API。
Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。
Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的。
3.运算符与语句
函数
函数参数的扩展:默认参数、不定参数。
箭头函数。
语句
for of:可以循环迭代可迭代的数据结构。这样的数据结构都有一个Symbol.iterator 属性,这个属性引用着相应的迭代器方法。
class类
class (类)作为对象的模板被引入,可以通过 class 关键字定义类。class 的本质是 function。它可以看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法。
基本用法:类定义,类的构造器/属性/方法,类的实例化,。
封装与继承:geter/setter, extends, super。
decorator 装饰器
模块化
export和import,export default。
4.异步编程
Promise对象:ES首次再语法层面支持异步。
Generator 函数
async函数
总结
这篇文章粗略的总结了ES的三个重要版本ES3、ES5、ES6主要给我们带来了哪些特性,并没有详细的解释它们。目的是通过这次总结出一个便于我们记忆ES的知识点大纲。
作者:猎户座小陈
链接:https://juejin.cn/post/7034019533925187597