ECMAScript2015
1. let和const
2. 数组解构
const arr = [1, 2, 3]
const [foo, ...rest] = arr
console.log(rest)
3. 对象解构
const obj = {name: 'wfy', age: 17}
const { name: objName = 'tom' } = obj
console.log(objName)
4. 模板字符串
- 反单引号包裹
- 可以换行
- 可以通过 ${} 插入表达式或变量
- 带标签的模板字符串
console.log`hey, ${name} is a ${gender}.`
5. 字符串的扩展方法
const message = 'Error: foo is not defined.'
console.log(
message.includes('foo')
)
6. 解构分配
function foo (first, ...args) {
console.log(first)
console.log(args)
}
foo(1, 2, 3, 4)
7. 展开数组参数
const arr = [1, 3, 5, 6, 6, 9]
console.log(...arr)
8. 箭头函数
- 不会改变this指向
arr.filter(i => i % 2)
9. 对象字面量
const bar = '345'
const obj = {
bar,
[1 + 1]: 2 // 通过 [] 让表达式的结果作为属性名
}
10. Object.assign(target, source)
11. Object.is
console.log(
// 0 == false // => true
// 0 === false // => false
// +0 === -0 // => true
// NaN === NaN // => false
// Object.is(+0, -0) // => false
// Object.is(NaN, NaN) // => true
)
12. Proxy
const person = {
name: 'zce',
age: 20
}
const personProxy = new Proxy(person, {
get (target, property) {
return property in target ? target[property] : 'default'
},
set (target, property, value) {
if (property === 'age') {
if (!Number.isInteger(value)) {
throw new TypeError(`${value} is not an int`)
}
}
target[property] = value
}
})
personProxy.age = 100
personProxy.gender = true
console.log(personProxy.name)
console.log(personProxy.xxx)
13. Proxy对比Object.defineProperty()
const person = {
name: 'tom',
age: 12
}
const personProxy = new Proxy(person, {
deleteProperty(target, property) {
console.log('delete', property)
delete target[property]
}
})
delete personProxy.age
console.log(personProxy)
const list = []
const listProxy = new Proxy(list, {
set(target, property, value) {
console.log('set', property, value)
target[property] = value
return true
}
})
listProxy.push(1)
console.log('list', list)
console.log('listProxy', listProxy)
const person = {}
Object.defineProperty(person, 'name', {
get() {
console.log('name被访问')
return person._name
},
set(value) {
console.log('name被设置')
person._name = value
}
} )
person.name = 'tom'
console.log(person.name)
14. Reflect(统一的对象操作api)
const obj = {
name: 'zce',
age: 18
}
console.log(Reflect.has(obj, 'name'))
console.log(Reflect.deleteProperty(obj, 'age'))
console.log(Reflect.ownKeys(obj))
15. class
class Person {
constructor(name) {
this.name = name
}
study() {
console.log('study hard and make progress everyday')
}
}
let p1 = new Person('tom')
console.log(p1)
p1.study()
16. static(静态方法)
class Person {
constructor (name) {
this.name = name
}
say () {
console.log(`hi, my name is ${this.name}`)
}
static create (name) {
return new Person(name)
}
}
const tom = Person.create('tom')
tom.say()
17. extends(继承)
class Student extends Person {
constructor (name, number) {
super(name)
this.number = number
}
hello () {
super.say()
console.log(`my school number is ${this.number}`)
}
}
18. Set(数据结构)
const s = new Set()
s.add(1).add(3).add(8)
s.forEach(value => console.log(value))
s.delete(8)
s.size
s.has(8)
s.clear()
const arr = [1, 2, 4, 5, 6, 6, 6, 8]
const result = [...new Set(arr)]
19. WeakSet(弱引用版本)
- 差异就在于Set会对于它使用到的数据产生引用
- 即便这个数据在外面被消耗,但是由于Set引用了这个数据,所以不会被回收
- 而weakSet的特点就是不会产生引用
- 一旦数据销毁,就可以被回收,所以不会产生内存泄漏的问题
20. Map(数据结构)
const m = new Map()
const tom = { name: 'tom' }
m.set(tom, 90)
console.log(m)
console.log(m.get(tom))
m.forEach((value, key) => {
console.log(value, key)
})
21. WeakMap(弱引用版本)
- 差异就是Map会对所使用的数据产生引用
- 即使这个数据在外面被消耗,但是由于Map引用了这个数据,所以依然不会回收
- 而WeakMap的特点就是不会产生引用
- 一旦数据销毁,就可以被回收,所以不会产生内存泄漏的问题
22. Symbol
- 新增的一种基本数据类型(原始数据类型),由此原始数据类型变为7种
- 唯一性
- 解决属性名冲突问题(两个Symbol永远不会相等)
- Symbol 模拟实现私有成员
23. for-of循环
- for of循环可以代替 数组对象 的forEach方法
- forEach无法跳出循环,必须使用some 或者 every 方法
- 遍历 Set 与遍历数组相同
- 遍历 Map 可以配合数组结构语法,直接获取键值
- 普通对象不能被直接 for...of 遍历
24. 迭代器(Iterator)
- 凡是含有iterator的结构,都可以进行遍历操作(generator原理)
25. generator函数
- 执行generator函数会返回一个遍历器对象,遍历器对象.next方法会返回一个对象,对象有两个属性,一个是value,value的值是yield后面跟的内容,还有一个是done,判断后面还有没有内容
ECMAScript 2016
1. includes
2. 指数运算符
```js
console.log(Math.pow(2, 10))
console.log(2 ** 10)
```
ECMAScript 2017
1. Object新增了api
- Object.values
- Object.entries
- Object.getOwnPropertyDescriptors
2. String新增了api
- String.prototype.padStart
- String.protptype.padEnd
3. 在函数参数中添加尾逗号
function foo (
bar,
baz,
) { }