es6入门第二章变量的解构赋值笔记
作者: 阿蒙 时间: 2017-6-26 标签: JavaScript 浏览: 1796 评论: 0
一. 数组的解构赋值
1. 只要等号两边的格式一样则可以将右边的值对应位置进行赋值。解构不成功变量的值为undefined。
2. 允许设置默认值, 只要值不是严格等于undefined便会取默认值。 即如果赋值的是null 也会取null而不是默认值。
3. 如果赋值表达式或者函数, 则是惰性求值, 如下面赋值了1 ,则f函数不会执行。 默认值可以引用其它已经声明了的变量,如果没有声明则抛出错误。
function f() { console.log('aaa'); } let [x = f()] = [1];
二.对象的解构赋值
1. 数组的解构是按照数组的下标顺序进行赋值, 对象则是根据属性名进行赋值 。
let { bar, foo } = { foo: "aaa", bar: "bbb" };2. 如果像上面例子中 左边变量名和右边属性名一样则无影响 ,如果左边变量名和右边不一样则值为undefined 。 如果变量名和属性不一样则如下写法
var { foo: baz } = { foo: 'aaa', bar: 'bbb' }; baz // "aaa" let obj = { first: 'hello', last: 'world' }; let { first: f, last: l } = obj; f // 'hello' l // 'world'let { foo: foo, bar: bar } = { foo: "aaa", bar: "bbb" };对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。
let { foo: baz } = { foo: "aaa", bar: "bbb" }; baz // "aaa" foo // error: foo is not defined下面代码中只有line是变量 ,loc start都是模式上面代码中,foo是匹配的模式,baz才是变量。真正被赋值的是变量baz,而不是模式foo。var node = { loc: { start: { line: 1, column: 5 } } }; var { loc: { start: { line }} } = node; line // 1 loc // error: loc is undefined start // error: start is undefinedlet obj = {}; let arr = []; ({ foo: obj.prop, bar: arr[0] } = { foo: 123, bar: true }); obj // {prop:123} arr // [true]对象的解构也可以指定默认值。var {x = 3} = {}; x // 3 var {x, y = 5} = {x: 1}; x // 1 y // 5 var {x:y = 3} = {}; y // 3 var {x:y = 3} = {x: 5}; y // 5 var { message: msg = 'Something went wrong' } = {}; msg // "Something went wrong"3. 变量的解构是声明与赋值为一体 ,所以给一个已经let和const声明的变量进行解构不能增加let后者const声明。4. 如果解构模式是嵌套的对象,而且子对象所在的父属性不存在,那么将会报错。// 报错 let {foo: {bar}} = {baz: 'baz'}; // foo 为undefined 再取子属性就会报错5. 如果将一个声明的变量进行赋值, 将大括号写在行首会被解析成块导致报错。6. 可以对数组进行对象属性的解构赋值 (数组也是特殊的对象)let arr = [1, 2, 3]; let {0 : first, [arr.length - 1] : last} = arr; first // 1 last // 3三. 字符串的解构赋值const [a, b, c, d, e] = 'hello'; a // "h" b // "e" c // "l" d // "l" e // "o"解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。let {length : len} = 'hello'; len // 5四 数值和布尔值得解构赋值let {toString: s} = 123; s === Number.prototype.toString // true let {toString: s} = true; s === Boolean.prototype.toString // true let { prop: x } = undefined; // TypeError let { prop: y } = null; // TypeError五. 函数的解构赋值1. 函数的参数也可以使用解构赋值。 下面代码中 对于函数来说, 它的参数就是x和y。 并且可以设置默认值function add([x, y]){ return x + y; } add([1, 2]); // 3
六. 不能使用圆括号的情况1. 变量声明语句中不能使用圆括号// 全部报错 let [(a)] = [1]; let {x: (c)} = {}; let ({x: c}) = {}; let {(x: c)} = {}; let {(x): c} = {}; let { o: ({ p: p }) } = { o: { p: 2 } };2. 函数参数中, 模式不能带圆括号// 报错 function f([(z)]) { return z; }3. 赋值语句中,不能将整个模式,或嵌套模式中的一层,放在圆括号之中。// 全部报错 ({ p: a }) = { p: 42 }; ([a]) = [5];4. 可以使用圆括号的只有一种 赋值语句的非模式部分,可以使用圆括号。
本文相关标签: es6
发表评论: