ES3
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的知识点大纲。