最近开始学习ES6,话说ES6出来快一年了,中间其实已经间断学习了一些,今天开始总结一下吧。
这次学习还是基于ruanyf的ES6教程。想要学习比较深入还是看看这个教程或者ES6官方文档吧。
首先,还是先附加一个网站,自动检测当前浏览器以及主流浏览器支持ES6的程度。感觉还是很有用的。
let
let只在命令所在的代码块内有效,并且不存在变量提升,同时不能重复声明。说明ES6支持代码块,这时候ES5中不写{}
的习惯终于可以修正了。
1 | var a = 1; |
我觉得有用的一点是,立即执行匿名函数(IIFE)可以换一种写法了。
比如之前比较常见的一个代码片段:
1 | var a = []; |
这时候通常做法是使用IIFE。
1 | var a = []; |
在ES6情况下,我们可以用:
1 | var a = []; |
事实上,对于这段代码,使用babel-preset-es2015转换出的结果是:
1 | ; |
另外,ES5中函数声明会直接提升到作用域顶部,而在ES6中则不会。
const
特性基本与let一致,只是一旦声明不能被赋值号修改。
1 | const foo; // Uncaught SyntaxError: Missing initializer in const declaration |
之所以说赋值号,是因为对于数组、对象之类的数据,const只是保证变量名指向的地址不变,并不保证该地址的数据不变。
1 | const foo = {}; |
想要冻结对象,使用Object.freeze
方法。
1 | var constantize = (obj) => { |
全局对象属性
在ES5中,使用var声明的变量会自动挂到作用域对象中。
1 | var a = 1; |
而在ES6中,由于多了let / const / class等声明方式,使用这些声明的全局变量不会挂到全局对象的属性中。
1 | let b = 1; |
数组解构赋值
注意,这种特性只适用于等号右边的数值具有可遍历特性的结构。
1 | var [a, [b], ...c] = [1, [3], 2, 3]; |
不完全解构允许存在,左边部分匹配或者右边部分匹配均可,但对于左边解构格式一定要完全配合右边的结构。
1 | var [a, [b], ...c] = [1, [3, 4], 2, 3]; // 左边部分匹配 |
这里涉及到一个function*
和yield
的使用方法。两者配合会生成一个类似java中使用的迭代器对象,并调用对象的next方法获取下一个返回值。
1 | function* gen() { |
对象结构赋值
这个跟数组解构赋值最重要的区别是区分了模式和变量。
1 | var { foo: baz } = { foo: "aaa", bar: "bbb" }; |
来个晕菜的:
1 | var node = { |
此处注意,因为代码块的存在,所以对于将一个已声明的变量用于解构赋值必须非常小心。
1 | var x; |
因为javascript将{x}解释为一个代码块,因此发生语法错误。所以要避免{}写在行首。
默认值
这里没什么可说的,要注意的就是ES6里内部执行都是严格的三等号,所以所有不是undefined的值都不会按照默认值来赋值。
1 | var { foo: baz = 3, bar = 4 } = { foo: null, bar: undefined }; |
解构赋值的用途
交换变量值
1 | [x, y] = [y, x]; |
提取数据
这里说的提取数据的来源包括:函数返回值,Json,以及函数形参。
1 | function example() { |