一.let/var:
1.let所声明的变量,只在let命令所在的代码块内有效。
2.只要块级作用域(?)内存在let,它所声明的变量就绑定这个区域。因此,在let命令声明变量tmp之前,都属于变量tmp的“死区”(程序会报错referenceError)
注:我记得js的for,if是没有块级作用域这个概念的,这里可以理解为在ES6中由于let的引入使for,if具有的块级作用域的概念。
这个新特性,提醒程序员养成良好的编代码习惯,一定要先声明再调用。
3.适合场景:for循环。循环语句部分是一个父作用域,而循环体内部是一个单独的子作用域。
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
// abc
// abc
// abc
4.不允许重复声明
let不允许在相同作用域内,重复声明同一个变量。
5.避免在块级作用域内声明函数。
6.do表达式:为了可以在块级作用域以外获得返回值,可以在块级作用域前加上do,使其变为do表达式。
注:试了谷歌和火狐,貌似都不支持do这个关键字…
7.const命令
const声明一个只读的常量,一旦声明,常量的值就不能改变。const一旦声明变量,就必须立即初始化。const作用域与let命令相同,只在声明所在的块级作用域内有效。
注:const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
8.声明变量
ES6声明变量的6种方法:var ,function,let,const,import,class
9.顶层对象的属性
在浏览器环境指的是window对象,在node指的是global对象。ES6中,var和function命令声明的全局变量,依旧是顶层对象的属性。let,const和class命令声明的全局变量,不属于顶层对象的属性。
二.变量的解构赋值
1.数组的解构赋值
解构赋值允许指定默认值:
如果默认值是一个表达式,那么这个表达式是惰性求值。
上面的代码中,因为xx能取到值,所以函数f根本不会执行,yy由于取不到值,所以将会被赋值。
2.对象的解构赋值
解构不仅可以用于数组,还可以用于对象。
注:下面代码中,let命令下面一行的圆括号是必须的,否则会报错,因为解析器会将起首的大括号,理解成一个代码块,而不是赋值语句。
3.和数组一样,解构也可以用于嵌套结构的对象。
4.字符串也可以解构赋值。
5.数值和布尔值的解构赋值:
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。
6.不能使用圆括号的情况
(1)变量声明语句中,不能带有圆括号
(2) 函数参数中,模式不能带有圆括号。
函数参数也属于变量声明,因此不能带有圆括号。
(3)赋值语句中,不能将整个模式,或嵌套模式中的一层,放在圆括号之中。
7.可以使用圆括号的情况
可以使用圆括号的情况只有一种:
赋值语句的非模式部分,可以使用圆括号。
[(b)] = [3]; // 正确
({ p: (d) } = {}); // 正确
[(parseInt.prop)] = [3]; // 正确
8.用途
(1)交换变量的值
let x = 1;
let y = 2;
[x, y] = [y, x];
(2)从函数中返回多个值
函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。
// 返回一个数组
function example() {
return [1, 2, 3];
}
let [a, b, c] = example();
// 返回一个对象
function example() {
return {
foo: 1,
bar: 2
};
}
let { foo, bar } = example();
(3)函数参数的定义
// 参数是一组有次序的值
function f([x, y, z]) { ... }
f([1, 2, 3]);
// 参数是一组无次序的值
function f({x, y, z}) { ... }
f({z: 3, y: 2, x: 1});
(4)提取json数据
let jsonData = {
id: 42,
status: "OK",
data: [867, 5309]
};
let { id, status, data: number } = jsonData;
console.log(id, status, number);// 42, "OK", [867, 5309]
(5)函数参数的默认值
jQuery.ajax = function (url, {
async = true,
beforeSend = function () {},
cache = true,
complete = function () {},
crossDomain = false,
global = true,
// ... more config
}) {
// ... do stuff
};
(6)遍历map结构
var map = new Map();
map.set('first', 'hello');
map.set('second', 'world');
for (let [key, value] of map) {
console.log(key + " is " + value);
}
如果只想获取键名或者键值
/ 获取键名
for (let [key] of map) {
// ...
}
// 获取键值
for (let [,value] of map) {
// ...
}
(7)输入模块的指定方法
加载模块时,往往需要指定输入哪些方法。解构赋值使得输入语句非常清晰。
const { SourceMapConsumer, SourceNode } = require("source-map");