ES2015官方文档,英文版
众所周知,JS的三大组成部分:
- ECMAScript
- DOM
- BOM
今天来聊一聊 ES,ES主要是用来定义JS的语法标准,由ECMA组织制定的。
JS起初是由网景公司开发的,为了推进JS的普及,网景向ECMA组织提交了JS草案,并成功通过了,ECMA为了保持公平性,没有采用网景公司给这门脚本语言的取名JavaScript(JS的取名也是完全为了蹭当时java大火的热度),而命名为ECMAScript,现在一般每年的6月都为更新标准,故ES2015为15年制定的(即ES6)。
值得一提的是:
- ES2015较前面的版本有较大的更新,但总体上还是向后兼容的
- 当时,微软开发的类似的脚本语言基本完成,所以两者基本处于并行发展的,所以,如今出现了微软系列的浏览器兼容性较差的局面,因为起初并不是依据ECMAScript标准进行开发的
ECMAScript 概述
ES是面向对象的,对象是若干属性的集合,并且每个属性定义了多个参数(比如writable表示可写性…),属性也作为容器,可由其他对象、原始值或函数表示
- 原始值(内置类型):
undefined
null
Boolean
Number
String
Symbol
注意:
函数实质上是可调用的对象。
内置对象
ES定义了一组内置对象,包含全局对象。
- 有关操作数值的
Math
Number
Date- 有关文本处理的
String
RegExp- 有关集合的
Map
Set- 有关结构化数据的
JSON
ArrayBuffer
DataView- 有关控制抽象的对象
生成器函数
Promise- 反射对象
Proxy
Reflect- …
内置操作符
- multiplicative operators,
- additive operators,
- bitwise shift operators
- relational operators
- equality operators,
- binary bitwise operators,
- binary logical operators,
- assignment operators
- comma operator
JS语法是宽松的,比如定义变量时不需要进行类型声明,JS会更加属性值的类型自动关联对应的类型,定义函数时,不要求函数声明出现再函数调用前…
Objects
- ES有来定义的语法,但和基于类的其他语言不同,ES中对象的创建有多种方式,通过字面量方式,或通过函数有初始化代码的构造函数创建;
- 每个构造函数都有prototype属性,用于基于原型的继承和共享属性。
- new表达式创建对象时,会调用对应的构造函数,如 new Date(2019,11)会返回一个新对象,而不用new时,返回结果依赖于构造函数的结果,比如 Date(),返回当前日期时间的字符串形式。
4,构造函数创建的对象,都有一个隐含的引用指向构造函数prototype属性,而且,原型还有可能隐含了一个非空引用指向自己原型,这被称为原型链。
对象和原型的关系:
- 在基于类的面向对象的语言中,通常状态由实例携带、方法由类携带、继承只是结构和行为;
而在ES中,状态方法有实例携带、结构 行为和状态都是继承的。 - 构造函数中有显式的prototype属性指向其原型,并不存在隐式的引用,而在其实例中,存在隐式的引用指向构造函数的原型(不可直接访问,可通过非标准的__proto__属性访问);
- 构造函数和原型都是对象,所以其内部都有隐式的引用指向其他的对象;
- 和其他基于类的语言不同,属性可以通过赋值的形式动态的添加到对象中;
- 可以通过给原型对象添加属性来给实例对象实现共享数据。
- 可见,ES对象不是基于类继承的,但基于构造函数、原型对象、方法的通用模式的抽象也总是很方便的定义类class结构。
ES的严格变体
也就是常说的 严格模式。
- ES定义这种模式的目的就是为了限制用户使用一些容易出错的可用特性。
- 实际上,这种模式排除了常规ES的一些特性语法和语义特性,并修改了一些特性的详细语义,而且定义了一些的新的错误条件。
- ES的严格模式只作用于当前单个的ES源文件内
- ES标准推荐一个项目应该由严格模式和完全无限制模式结合。
术语和定义
- type
数据值的集合 - primitive value
原始值,一种直接在语言实现的最低层表示的数据,Undefined Null Boolean Number Symbol String 之一 - object
Object对象的成员,对象是属性的集合,且对象只有一个原型对象(可为null值)。 - constructor
用于创建和初始化对象的函数对象,有一个prototype属性指向其原型对象(用于继承和共享属性)。 - prototype
原型对象,提供共享属性给其他对象,构造函数创建对象时,新对象隐式引用构造函数的prototype属性(即也指向构造函数的原型)。构造函数可通过constructor.prototype访问其原型,添加再原型上的属性是共享的,继承后,所以实例都可共享原型,通过Object.create()函数可以创建隐式指定原型的新对象 - ordinary object
普通对象,具有所有对象必须支持的基本内部方法的默认行为。 - exotic object
外类对象,没有一个或多个必须由所有对象支持的基本内部方法的默认行为。任何不是对象不是普通对象就是外来对象。 - standard object
标准对象,ECMA标准中已经定义好语义的对象 - built-in object
内置对象,由ES实现的指定对象 - undefined value
当一个变量没有被赋予一个值时,就使用undefined原始值 - Undefined type
Undefined类型只有一个专有的值undefined - null value
用于表示不存在任何对象值的原始值,常用于初始化对象值 - Null type
Null类型只有一个专有的值null - Boolean value
只有两种布尔值:false 和 true - Boolean object
布尔对象,是标准的内置Boolean构造函数的实例,可以将布尔对象强制转换为布尔值。 - String value
字符串原始值,由若干16位无符号int表示的UTF-16字符组成的有限有序序列,ES对字符串值没有其他的任何限制了。 - String style
所有可能的字符串值的集合 - String object
字符串对象,是标准的内置String构造函数的实例,可以将字符串对象强制转换为字符串原始值。 - Number value
与双精度64位二进制格式IEEE 754-2008值对应的原始值 - Number type
所有可能的数值的集合,包括 NaN值,正无穷大 和 负无穷大 - Number object
数值对象,是标准的内置的Number构造函数的实例,可以将数值对象强制转为数值原始值。 - Infinity
表示正无穷大的数值原始值 - NaN
表示一个不是数值的数值原始值,Nat a Number - Symbol value
符号,表示一个唯一的、非字符串对象属性键的一种原始值。 - Symbol type
所有可能的符号值的集合 - Symbol object
是标准的内置Symbol构造函数的实例 - function
可作为子程序调用的Object类型,其中的可执行代码和状态确定了函数的调用行为。 - built-in function
内置函数,比如内置函数有:parseInt Math.exp… - property
属性,对象中关联键(字符串值或符号值)和值的部分,值可以直接表示为数据值(原始值、对象或函数对象)或间接通过一对访问器函数 - method
作为属性值的函数就叫做方法,当函数作为对象的方法调用,对象将作为函数的this值传递给函数。 - built-in method
作为内置函数的方法就叫做内置方法 - attribute
定义属性的某些特征的内部值 - own property
对象本身直接包含的属性 - inherited property
继承属性,一个对象的属性不是自身属性,而是对象的原型的属性,可见属性不是自身属性就是继承属性。