ES6 变量
- let 声明变量
- const 声明常量
- 块级作用域
let 声明:
- 使用 let 声明不会有变量提升。
- 在循环中,使用 let 声明变量会特殊处理,每次循环,都会开启新的作用域,循环结束后会销毁;(!不要在外面声明后再循环体使用)
- 底层实现上,实际上也会有提升,但是,提升后会将其放入到“暂时性死区”,如果访问改区的变量,就会报“cannot access ‘a’ before initialization”,当代码运行到声明语句时,会将其移出死区。
const 声明常量:
- 开发中,尽量使用 const 声明变量,避免被随意更改;因为实际开发中,很多变量,都不会更改;
- 很多框架、第三方库都要求数据不可变。
- 常量不可变,是指声明常量的内存空间不变,该内存空间中指向的其他空间可以改变,比如对象;
- 常量:
- 特殊常量:一定不可变,全部大写 ,多个单词之间使用下划线分割。 如 PI(圆周率)、月底距离
- 普通常量
- for 循环中,循环变量不可以用 const 声明,for in 循环可以
块级作用域:执行完销毁,块级作用域用 let 定义的变量,外部不能访问。
字符串和正则
新的 Unicode 支持
字符串 api
模板字符串
模板字符串标记
模板字符串前可以加上标记函数:
- 参数 1:被插值分割的字符串数组。
- 后续参数:所有插值。
- String.row
自动转义\n
正则粘连标记
函数
参数默认值
剩余参数
arguments 缺陷:
- 和形参配合使用,容易混乱。
- 不符合语义。
- 一个函数只能由一个剩余形参
- 剩余参数必须放到最后
展开运算符
浅克隆
传参
柯里化函数
明确函数的两个用途
以前:
es6:
new.target :如果用 new 调用构造函数,就返回构造函数本身。不使用 new 调用,就返回 undefined
箭头函数
细节:
- 箭头函数是函数表达式,理论上,任何使用函数表达式的场景都可以使用箭头函数。
- 箭头函数没有原型。 所以不能做构造函数。
- 箭头函数中没有自己的 this、arguments、new.target。如果用了,使用的是外层的。
- 箭头函数中的 this,取决于箭头函数定义的位置的 this 的指向,与如何调用无关。
- 不在函数里的 this 指向 window 。
应用场景:
- 临时是使用:
- 为了绑定外层 this 的函数。
- 为了保持代码简洁,比如:数组中的回调函数。
- 对象的属性一般不用箭头函数
对象
新增对象字面量语法:
- 成员速写
- 方法速写
- 计算属性名
Object 函数新增的 api
- Object.is
用于判断两个数据是否相等,基本上和严格相等(===)差不多,除了这两点:
- Object.assign
用于混合对象,但 es7 的 …obj 展开符更好用
- Object.getOwnProperrtyNames 的枚举属性。
该方法以前就有,只不过 es6 明确要求了如何排序:
a. 先排数字,升序
b. 再排其他,按照书写顺序
- Object.setPrototypeOf
设置某个对象的原型
类
传统构造函数的问题:
- 属性和原型方法定义分离,可读性差。
- 原型成员可枚举
- 默认情况下,构造函数还是可以当作普通函数使用
类的特点:
- 类声明不会被提升,与 let 和 const 一样,存在暂时性死区。
- 类中所有代码都在严格模式下执行。
- 类的所有方法都是不可枚举的。
- 类中所有方法都无法被当作构造函数使用
- 类的构造器必须使用 new 来调用。
类的其他书写:
- 可计算的成员名:
- getter 和 setter
Object.defineProperty 可定义某个对象成员苏醒的读取和设置。
getter 和 setter 设置的属性不在原型上
- 静态成员
static width = 50;
构造函数本身的成员,不能通过实例对象访问。
-
字段初始化器(es7)
- 使用 static 的字段初始化器,是静态成员。
- 没用使用 static 的字段初始化器,添加的成员位于对象上。
- 箭头函数在字段初始化器位置上,指向构造器构造的对象上,但会占用多一点内存空间。
-
类表达式
- 装饰器
类的继承
关键字: