let和constant命令
不存在变量提升
变量一定要先声明再使用
暂时性死区
块级作用域里存在let命令,则它的变量就绑定这个区域不受外部的影响,即从一开始就形成封闭作用域。在声明之前都是不可用的.
不允许重复声明
const命令
对于复合类型的变量,变量名不指向数据,而指向数据所在的地址,const只保证变量名指向的地址不变,而不保证该地址的数据不变
变量的解构赋值
数组的解构赋值
如果结构不成功,则变量的值等于undefined.
不完全结构——等号左边的只匹配一部分的等号右边的数组
对象的解构赋值
对象的属性没有次序,变量必须与属性同名,真正被赋值的是属性后面的变量,而不是属性本身
字符串的解构赋值
任何类似数组的对象都有一个length的属性,因此可以对这个属性解构赋值
数值和布尔值的解构赋值
函数参数的解构赋值
用途
- 交换变量的值
- 从函数返回多个值
- 函数参数的定义
- 提取JSON数据
- 函数参数的默认值
- 遍历map解构
- 输入模块的指定方法
字符串的扩展
字符的Unicode表示法
‘\u0061’//a
codePointAt()
String.fromCodePoint()
at()
normalize()
includes(),startsWith(),endsWith()
repeat()
padStart(),padEnd()//ES7
模板字符串
模板字符串用反引号(`)标识,表示多行字符串时,所有空格和缩进都回被保留在输出之中。嵌入变量,需要将变量名放在${}之中
正则的扩展
u修饰符
用于正确处理大于\uFFFF的Unicode字符
y修饰符
与g修饰符类似,但是y修饰符要确保匹配从剩余的第一个位置开始
sticky属性
flags属性
后行断言
先行断言/\d+(?=%)/,/\d+(?!%)/
后行断言/(?<=$)\d+/,/(?
数值的扩展
二进制(0b)和八进制(0o)
Number.isFinite(),Number.isNaN()
Number.parseInt(),Number.parseFloat()
Number.isInterger()
Number.EPSILON
安全整数和Number.isSafeInteget()
JavaScript能准确表示的整数范围在-2^53~2^53之间(不含端点),超过将无法准确表示。
Number.MAX_SAFE_INTEGER===Math.pow(2,53)-1//true
Number.MIN_SAGE_INTEGER===Math.pow(-2,53)+1//true
Math对象的扩展
- Math.trunc()//返回整数部分
- Math.sign()//判断正负
- Math.cbrt()//立方根
- Math.clz32()//32位二进制表示整数的前导0的个数
- Math.imul()//两个数以32位带符号整数形式相乘
- Math.fround()//单精度浮点数形式
- Math.hypot()//参数的平方和的平方根
- Math.expm1()
- Math.log1p()
- Math.log10()
- Math.log2()
- 2**3//8
数组的扩展
Array.from()
将类似数组的对象和可遍历的对象转为真正的数组,例如:
let arrayLike = {
'0':'a',
'1':'b',
'2':'c',
length:3
}
Array.from()还可以接受第二个参数,用于将处理后的值放入返回的数组
Array.of()
主要用来弥补数组构造函数Array()的不足
数组实例的copyWithin()
Array.prototype.copyWithin(target,start=0,end=this.length)
数组实例的find()和findIndex()
数组实例的fill()
数组实例的entries(),keys(),values()
函数的扩展
函数的length属性
返回没有指定默认值的参数个数
rest参数
rest参数只能是最后一个参数
函数的length属性不包括rest参数
name属性
箭头函数
- 函数体内的this对象就是定义时所在的对象而不是使用时所在的对象
- 不可以作为构造函数,不可以使用new命令
- 不可以使用arguments对象,使用rest参数代替
- 不可以使用yield命令
尾调用优化
只要使用尾递归,就不会发生栈溢出,相对节省内存
函数参数的尾逗号
对象的扩展
Object.is()
Object.assign()
这是一个浅拷贝的方法
属性的遍历
- for…in:遍历自身和继承的可枚举属性
- Object.keys(obj):返回数组,包括自身(不含继承)所有可枚举属性
- Object.getOwnPropertyNames(obj):返回数组,包括自身所有属性
- Object.getOwnPropertySymbols(obj):返回数组,包含对象自身所有Symbol属性
- Reflect.ownKeys(obj):返回数组,包含自身所有属性(不管是否Symbol,也不管是否可枚举)
Object.values(),Object.entries()
对象的扩展运算符
Object.getOwnPropertyDescriptors()
Symbol
这是一种新的原始数据类型,前六种是undefined,null,Number,Boolean,String,Object
Symbol.for(),Symbol.keyFor()
Symbol.for(‘foo’) === Symbol.for(‘foo’);//true
Symbol.keyFor()返回一个已登记的Symbol类型的key
Proxy and Reflect
拦截操作 | 描述 |
---|---|
get(target,propKey,receiver) | 拦截属性读取 |
set(target,propKey,receiver) | 拦截属性设置 |
has(target,propKey) | 拦截propKey in proxy |
deleteProperty(target,propKey) | 拦截delete proxy[propKey] |
ownKeys(target) | 拦截getOwnPropertyNames等 |
getOwnPropertyDescriptors(target,propKey) | 拦截getOwnPropertyDescriptors |
defineProperty(target,propKey,propDesc) | 拦截defineProperty等 |
preventExtension(target) | 拦截preventExtension(proxy) |
getPrototypeOf(proxy) | 拦截getPrototypeOf |
isExtensible(target) | 拦截isExtensible(proxy) |
setPrototypeOf(proxy) | 拦截 setPrototypeOf(proxy,proto) |
apply(target,Object,args) | 拦截proxy实例作为函数的调用如proxy(…args),proxy.call(object,…args),proxy.apply() |
construct(target,args) | 拦截proxy实例作为构造函数的调用如new proxy(…args) |
Reflect概述
- 将Object对象一些明显属于语言内部的方法放到Reflect对象上
- 修改某些Object方法的返回结果,如Reflect.defineProperty(obj,name,desc)在无法定义属性时返回FALSE
- 让Object操作都变成函数行为
- Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,都能在Reflect上面找到对应的方法
二进制数组
Set和Map数据结构
Set
数据结构Set类似数组,但是成员的值都是唯一的,没有重复的值,向set中加入值时,不会发生类型转换
Set实例的属性和方法
属性
- Set.prototype.constructor:构造函数
- Set.prototype.size:返回Set实例的成员总数
方法
- add(val):添加某个值,返回Set本身
- delete(val)删除某个值,返回布尔值
- has(val):返回布尔值,表示是否为Set成员
- clear():清除所有成员,没有返回值
遍历操作
- keys()
- values()
- entries()
- forEach()
WeakSet
- WeakSet的成员只能是对象,不能是其他类型的值
- WeakSet中的对象都是弱引用,垃圾回收机制不考虑WeakSet对该对象的引用
Map
Map数据结构类似对象,也是键值对的集合,但是“键”的范围不限于字符串
注意 只有对同一对象的引用,Map结构才将其视为同一个键,否则即使键名相同,内存地址也是不同的,Map将其视为不同的两个键
Map实例的属性和方法
- size属性
- set(key,val)
- get(key)
- has(key)
- delete(key)
- clear()
遍历操作
- keys()
- values()
- entries()
- forEach()
WeakMap
只接受对象作为键名,不接受其他类型的值作为键名,而且键名所指向的对象不计入垃圾回收机制
Iterator and for…of
Generator函数
Generator函数是一种异步编程解决方案,封装了多个内部状态
yield只能在生成函数里面出现,否则会报错
注意 yield语句本身没有返回值,或者说总是返回undefined,next方法可以带一个参数,这个参数作为上一个yield的返回值,示例程序:
function* foo(x) {
var y = 2 * (yield (x + 1));//y = 24
var z = yield (y / 3);//z = 13
return (x + y + z);//返回42
}
var a = foo(5);
console.log(a.next());
console.log(a.next(12));
console.log(a.next(13));
Promise对象
Promise构造函数接收一个函数作为一个参数,该函数的两个参数分别是resolve和reject,promise实例生成后可以用then方法分别指定Resolved和Reject状态
Promise.resolve()将现有对象转为Promise对象
异步操作和Async函数
Generator函数
Thunk函数
co模块
自动执行Generator
async函数
Generator函数的语法糖,内置执行器,同时有更好的语义和适应性。
正常情况下await后面应该是Promise对象,如果不是会转成promise对象并立即resolve
Class
Class 可以看做只是一个语法糖,一个类必须有constructor方法,如果没有显示定义,一个空的constuctor会被默认添加。Class不存在变量提升
Class的静态方法
加上static,实例无法继承静态方法,只有子类可以调用。ES6规定Class内部只有静态方法,没有静态属性,只有实例属性,ES7提案只需在属性前面加上static就可以了
Module
通过import来引入模块功能,export用于规定模块的对外接口