let 和 const
let 的特点
- let 的作用域在最近的 {} 之间
- 如果在 let a 之前使用 a ,那么报错(Temp Dead Zone)
- 如果重复let a , 会报错
- let 存在块级作用域
let 循环
const 特点
- const 的作用域在最近的 {} 之间
- 如果在 const a 之前使用 a ,那么报错(Temp Dead Zone)
- 如果重复const a , 会报错
- 只有一次赋值机会,并且必须在声明的时候立马赋值
解构赋值
数组匹配 [ b, a ] = [ a, b ]
- 交换变量
- 默认值
undefined 和null 的区别:
对象匹配 let { a, b, c } = objABC
- 获取对象所有属性
- 对象浅拷贝
- 对象合并 ...
参数处理
默认参数值
函数默认参数允许在没有值或undefined被传入时使用默认形参。
上面的代码等价于:
剩余参数
展开运算符
先来看一个数组的扩展:
... 相当于把数组拆开
- 函数参数的扩展
- 类数组对象转数组
ES5 写法是:
ES6 写法如下:
或者
模板字面量
多行字符串
字符串插值
可以用来拼接HTML:
带标签的模板字面量
如果一个模板字符串由表达式开头,则该字符串被称为带标签的模板字符串,该表达式通常是一个函数,它会在模板字符串处理后被调用,在输出最终结果前,都可以通过该函数来对模板字符串进行操作处理。
运行结果如下:
把 name 和 score 改下:
原始字符串
在标签函数的第一个参数中,存在一个特殊的属性raw,我们可以通过它来访问模板字符串的原始字符串,而不经过特殊字符的替换。
原有字面量增强
- 更安全的二进制字面量(0b1111101)
- 更安全的八进制字面量(0o767)
- 字符串支持 Unicode
-- String.fromCodePoint
-- String.prototype.codePointAt - 正则表达式字面量添加 Unicode 支持(u 标记)
- 正则表达式添加 y 标记,支持粘滞匹配
对象属性加强
属性定义支持短语法 obj = { x, y }
ES5写法:
ES6写法:
属性名支持表达式
动态属性名
原来的写法:
ES6:
属性修饰符Object.defineProperty()
a === 1 && a ===2 && a === 3 问题
类 class
ECMAScript 2015引入了一种对象方法的简短写法, "function" 关键字可以丢掉:
构造函数
上面的代码等价于
class 共有属性不能是非函数:
- 可以用原型写xxx.prototype.race = 'animal'
- get
但是 不能通过 BritishShorthair.race = newvalue来改
所以又要用到 set
再修改就发现改成功了:
如果想让属性只读,就不写set
ES6 模块
用 import 和 export 写好之后,
可以用webpack 或者 parcel (推荐) 打包 ,然后引入