ES6的功能真的是非常的强大,为了对其有一个更好的学习体会过程,就想把它做成渐进式的笔记,方便一起交流学习。
变量、常量
在ES5中我们使用 var 来声明一个变量,而新的ES6中加入了常量的声明,我们分别使用 let 和 const 来声明变量和常量
var a = 1; //ES5
let b = 2; //ES6 变量
const c = 3; //ES6 常量
在这里我们我们要注意两个名词 变量提升 和 暂时性死区
变量提升是ES5中的一个奇怪特性,未被声明的变量在使用时会被赋值为“undefined
”
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;
暂时性死区是ES6中标我们要注意的一点,只要块级作用域内存在 let (const)命令,它所声明的变量(常量)就“绑定”这个区域,在使用 let (const)声明之前该变量都是不可用的,否则会报错
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
作用域
在ES5中我们只有 全局作用域 和 函数作用域 ,这就产生了很多不合理的情况,比如:用来计数的循环变量泄露为全局变量
var s = 'hello';
for (var i = 0; i < s.length; i++) {
console.log(s[i]);
}
console.log(i); // 5
在ES6中使用 块作用域 就能更好的避免变量的泄露,并且以往在ES5中使用的立即执行函数将可以不再需要了
//立即执行表达式
(function () {
var tmp = ...;
...
}());
// 块级作用域写法
{
let tmp = ...;
...
}
箭头函数
再ES6中新增了箭头函数来定义一个函数,基本用法:
//ES5
function full () {
var a = 1;
......
}
//ES6
const full = () => { let a = 1;}
匿名函数也可以写成如下:
() => {}
参数只有一个可以省略“()”,函数内表达式的值为返回值的情况,可以省略“{}”,如下:
//ES5
function full (v) {
return v + 1;
}
//ES6
const full = v => v + 1;
默认参数
在ES6中新增了函数的默认参数设置,在参数检测上为我们提供了很好的便利,基本设置如下:
//ES5中需要使用变通的方法
function log(x, y) {
y = y || 'World';
console.log(x, y);
}
log('Hello') // Hello World
//ES6
function log(x, y = 'World') {
console.log(x, y);
}
log("Hello") // Hello World
同时,我们还可以利用这一功能做到必选参数的检测:
//ES6
function required () {
return new Error("x is required !");
}
function log(x = required(), y = 'World') {
console.log(x, y);
}
log() // x is required !</code>
解构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
let [a, b, c] = [1, 2, 3];
a // 1
b // 2
c // 3
本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。下面是一些例子:
let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3
let [ , , third] = ["foo", "bar", "baz"];
third // "baz"
let [x, , y] = [1, 2, 3];
x // 1
y // 3
let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]
let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []
ES6拥有强大的新特性以及功能,以上这些只不过是冰山一角,但学习的过程的循序渐进的,在实际使用中学习更易于我们掌握精髓。