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都是模式

var node = {
  loc: {
    start: {
      line: 1,
      column: 5
    }
  }
};

var { loc: { start: { line }} } = node;
line // 1
loc  // error: loc is undefined
start // error: start is undefined


let 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"
上面代码中,foo是匹配的模式,baz才是变量。真正被赋值的是变量baz,而不是模式foo。
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"

let {length : len} = 'hello';
len // 5
四 数值和布尔值得解构赋值
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。

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. 可以使用圆括号的只有一种  赋值语句的非模式部分,可以使用圆括号。






0

本文相关标签: es6

赞助商

发表评论: