ES3到ES5再到ES6,整理JS语法知识

1,819 阅读7分钟

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语言的历史》:

  1. 基本语法:借鉴C语言和Java语言。
  2. 数据结构:借鉴Java语言,包括将值分成原始值和对象两大类。
  3. 函数的用法:借鉴Scheme语言和Awk语言,将函数当作第一等公民,并引入闭包。
  4. 原型继承模型:借鉴Self语言(Smalltalk的一种变种)。
  5. 正则表达式:借鉴Perl语言。
  6. 字符串和数组处理:借鉴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的知识点大纲。