返回首页 - Notes - 2016

ES6


Babel


let和const

let 声明的变量只在其所在代码块有效

let 没有 var 的变量提升功能,用 let 声明的变量,在变量声明前使用会报错(用 var 声明的变量则不会)

如果在代码区块内有 letconst 声明的变量,则在该代码区块一开始就形成了封闭作用域,在声明前使用这些变量都会报错

let 不允许在同一个作用域内重复声明同一个变量

新增的 let 实际上为 JavaScript 带来了块级作用域

const 冻结的是变量名指向的地址,但并不能保证该地址的数据保持不变,也就是说无法只通过使用 const 来完全冻结一个对象类型的变量

如果要将对象完全冻结,需要使用 Object.freeze

const ruchee = Object.freeze({ name: 'Ruchee', email: 'my@ruchee.com' })

上面演示的代码只是冻结对象本身,如果要将对象的属性也冻结,需要使用下面的代码

let freezeAll = (obj) => {
    Object.freeze(obj)
    Object.keys(obj).forEach((key, val) => {
        if (typeof obj[key] === 'object') {
            freezeAll(obj[key])
        }
    })
    return obj
}

const ruchee = freezeAll({
    name: 'Ruchee',
    email: 'my@ruchee.com',
    likes: {
        a: 'books',
        b: 'foods'
    }
})

变量的解构赋值

一些解构赋值的例子

var [a, b, c] = [1, 2, 3]
console.log(a)  // 1
console.log(b)  // 2
console.log(c)  // 3

let [x, [[y], z]] = [1, [[2], 3]]
console.log(x)  // 1
console.log(y)  // 2
console.log(z)  // 3

let [xx, yy, zz] = [1, 2]
console.log(xx)  // 1
console.log(yy)  // 2
console.log(zz)  // undefined

let [, , third] = [1, 2, 3]
console.log(third)  // 3

let [head, ...tail] = [1, 2, 3]
console.log(head)  // 1
console.log(tail)  // [2, 3]

let [d, e, ...f] = [1]
console.log(d)  // 1
console.log(e)  // undefined
console.log(f)  // []

只要某种数据结构具有 Iterator 接口,就都可以采用数组的形式进行解构赋值

解构赋值允许设置默认值,且默认值可以是一个表达式,表达式形式的默认值只在用到的时候才会求值

let [x = 1] = []
console.log(x)  // 1

let [y = 2] = [undefined]
console.log(y)  // 2

let [z = 3] = [null]
console.log(z)  // null

let ff = () => { return 4 }
let [xx = ff()] = []
console.log(xx)  // 4

对象也支持解构赋值

let { x } = { x: 'aaa', y: 'bbb' }
console.log(x)  // aaa

let { y: z } = { y: 'bbb' }
console.log(z)  // bbb

let { a:a } = { a: 'aaa' }
console.log(a)  // aaa

解构赋值支持复杂解构的多层嵌套

字符串和函数参数也支持解构赋值


函数扩展

函数参数终于允许设置默认值了

函数的 length 属性获取函数参数的个数(不包括有默认值的参数和 rest 参数)


date:2016-06-13、2016-06-14