@wangjialin
2017-07-29T13:47:38.000000Z
字数 2115
阅读 1012
ES6
最近用express写项目的时候,使用到了ES6的一些新特性,其中一个是解构赋值,在解析url参数生成json数据使用解构赋值十分方便。特意看了《ES6标准入门》研究了一下,发现解构赋值不仅仅只有对象可以使用,数组、字符串、数值甚至布尔值都可以使用解构赋值~下面就是总结啦~
为了解决ES5没有真正意义的局部变量问题,ES6引入了新的变量声明方法,那就是 let 和 const
let 或者 const 命令声明一个变量,这些变量就会形成一个封闭的作用域,只要在声明前被调用,就会报错——ReferenceError
let a = 123;if (true) {console.log(a); //ReferenceErrorlet a = 1;}
let声明的是一个变量, const声明的是一个常量,不可以被修改,但是 const 命令对于引用类型的变量来说,只保证指向的地址不变,但是地址的数据依旧可以被修改,如果想将对象的属性冻结不被修改,可以使用 Object.freeze(需要被冻结的对象) 方法let 可以只声明不赋值, const声明时不赋值会报错
//先寻找同名属性,再赋值给对应的变量let {foo, bar} = {foo: 1, bar: 2} //foo=1,bar=2let {foo: fo, bar: ba} = {foo: 1, bar: 2} //fo=1,ba=2
默认值生效的条件是:对象的属性值===undefined
let {x: 3} = {x: undefined} //x=3let {x: 3} = {x: null} //x=null
//1. 解构不成功undefinedlet {bar} = {foo: 1} //bar:undefined//2. 注意不要重复声明let foo;let {foo} = {foo: 1} //SyntaxError:Duplicate declaration "foo"//3. 注意不要将大括号写在行首var x;{x} = {x: 1}; //SyntaxError: syntax error//可以将上面的写成({x} = {x: 1}) x=1//4. 模式和变量的划分//只要属性的值含有变量,属性就是模式 ———— 只有变量才会被赋值,模式不会被赋值let {p: [x, {y}]} = {p: ["hello", {y: "world"}]}; //x=hello;y=world;p是模式let {loc: {start: {line}}} = {loc: {start: {line: 1, column: 5}}}//loc和start是模式,line=1
let [a, [b, [c]]] = [1, [2, [3]]]; //a=1,b=2,c=3//只要某种数据结构具有Iterator接口就可以数组方式解构赋值let [x, y, z] = new Set(["a", "b", "c"]) //x="a",y="b",z="c"
let [x=1, y=x] = [1, 3]; //x=1,y=3
//1. 解构不成功undefinedlet [x=1, y] = [2]; //x=2,y=undefined//2. 注意顺序let [x=y, y=3] = [1, 3]; //默认值可以引用解构赋值的其他变量,但是其他变量必须已经声明
//1. 字符串转换成类似数组的对象const [a,b,c,d,e] = "hello"; //a="h",b="e",c="l",d="l",e="o"const {length: len} = "hello"; //len=5//2. 数值和布尔值转为对象const {toString: s1} = 123; //s1=Number.prototype.toStringconst {toString: s2} = true; //s2=Boolean.prototype.toString
//1. 函数参数使用解构赋值var arr = [[1, 2], [3, 4]].map(([a, b]) => a + b) //arr=[3, 7]//2. 函数参数使用默认值function move({x=0, y=0} = {}) {return [x, y]}move({x: 3, y:8}) //[3, 8]var arr = [1, undefined, 3].map((x="yes") => x) //arr=[1, "yes", 3]
只有赋值语句的非模式部分可以使用圆括号,其他都不能使用圆括号
{p: (a)} = {p: 2} //a=2
一言以蔽之:解构赋值就是赋值等号前后的模式一致,前面的变量就可以按照对应的模式获得后面的值
具体应用场景:
1. 交换变量值
2. 从函数返回多个值
3. 提取json数据(eg:解析url参数)
4. 函数参数的定义以及默认值
5. 遍历Map解构获取键名或者键值
6. 使用require输入模块的指定方法并接收