npm install -g babel-cli
node
的命令行工具:babel-node
babel hello.js
babel hello.js -o hello_fixed.js
babel src -d output
JS
版本的代码:babel hello.js -o hello.js --presets es2015
Browserify
配合转换成浏览器使用的版本:browserify hello.js -o hello_fixed.js -t [ babelify --presets [ es2015 ] ]
用 let
声明的变量只在其所在代码块有效
let
没有 var
的变量提升功能,用 let
声明的变量,在变量声明前使用会报错(用 var
声明的变量则不会)
如果在代码区块内有 let
和 const
声明的变量,则在该代码区块一开始就形成了封闭作用域,在声明前使用这些变量都会报错
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
参数)