学习 ES6 的必要性
前端的发展越来越快,因为其强大的扩展性、跨平台性,所以 Es6 标准就出来了.近来我一直在学习 Es6,把这些笔记都记录下来.
let 命令
- let 命令用来初始化变量,但是所声明的变量只在所属代码块有效.
- 不存在变量的提升(变量在声明之前使用,值为 undefined).
- let 命令存在"暂时性死区",只要块级作用域存在 let 命令,所声明的变量就"绑定"到这个区域,不受外部的影响.
- let 命令不允许重复声明.
do 表达式
let x = do {
let t = f()
t * t + 1
}
变量 x 会得到整个块级作用域的返回值.
const 命令
- const 声明一个只读的常量,一旦初始化,就必须赋值.
- const 也只在对应的块级作用域有效.
- const 实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址不得改动,如下图:
数组的解构赋值
解构赋值:按照一定的模式从数组和对象中提取值,对变量进行赋值.此前为变量赋值只能直接指定值.
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 [foo = true] = []
foo // true
let [x, y = "b"] = ["a"]
// x = 'a'
// y = 'b'
对象的解构赋值
对象也可以进行解构赋值,但是对象的解构赋值与数组不同.数组的解构赋值直接按照次序来就可以了,但是对象的解构赋值必须与属性名同名,才能取到正确的值.
let { far, foo } = { foo: "aaa", bar: "bbb" }
foo // "aaa"
far // "bbb"
下面来看一个反例
let { baz } = { foo: "aaa", bar: "bbb" }
baz //undefined
baz取不到正确的值
如果变量名与属性名不一致,可以写成这样
var { foo: baz } = { foo: "aaa", bar: "bbb" }
baz //"aaa"
let obj = { first: "aaa", last: "bbb" }
let { first: f, last: l } = obj
f // "aaa"
l //"bbb"
由此可见,对象的解构赋值的内部机制是先找到同名的属性,然后再赋值给对应的变量,真正被赋值的是后者,而不是前者. 与数组一样,解构也可以用于嵌套的结构的对象.
let obj = {
p: {
'Hello',
{
y:'World'
}
}
};
let { p : {x,{y} } } = obj;
x // "Hello"
y // "World"
函数参数的解构赋值
function add([x, y]) {
return x + y
}
add([1, 2]) //3
;[
[1, 2],
[3, 4]
].map(([a, b]) => a + b)
//[3,7]
解构赋值的好处
- 交换变量的值
let x = 1
let y = 2
;[x, y] = [y, x]
这样的语法在以前被认为是错误的,现在可行了
- 从函数返回多个值
//返回一个数组
function example() {
return [1, 2, 3]
}
let [a, b, c] = example()
//返回一个对象
function example() {
return {
foo: 1,
bar: 2
}
let { foo, bar } = example()
}
- 函数参数的定义
解构赋值可以很方便的将一组参数与变量名对应起来
//参数是一组有次序的值
function f([x,y,z]){
....
}
传参数:
f([1,2,3]);
function f({x,y,z}){
....
}
传参数:
f({z:3,y:2,x:1});
- 提取 json 数据
这是带给我我最惊喜的功能了,简直方便不少啊!!
假如有一段 json 数据是这样的:
let jsonData = {
id : 34,
status : 200,
data:[45,34,32]
}
下面利用解构赋值来解析:
let { id , status , number } = jsonData ;
console.log(id , status , number);
// 34 , 200 , [45,34,32]
的确比以前用起来方便许多.