es6--变量的解构赋值

基本用法:

以前为变量赋值只能直接指定值;

var a = 1;
var b = 2;
var c =  3;

 而es6允许写成下面这样:

var [a, b, c] = [1, 2, 3];

 上面的代码表示:可以从数组中提取值,按照位置的对应关系对变量赋值。

    举个获取元素的例子

   

        <div id="app">
	  <div id="top">1</div>
	  <div id="main">2</div>
	  <div id="footer">3</div>
	</div>
	<script>
	  function $(id) {
	    return document.getElementById(id);
	  }
      var [mytop, mymain, myfooter] = [$("top"),$("main"),$("footer")];
      alert(myfooter.innerHTML) // 1
	</script>

 本质上,这种写法属于"模式匹配",只要等号两边的模式相同,左边的变量就会赋予对应的值,下面的是使用嵌套数组进行解构的例子。

let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3

let [,, third] = ["foo", "bar", "baz"];
third // "baz"


let [x,, y] = [1, 2, 3];
x // 1
y // 3

let [head, ...tail] =  [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]

let [x, y, ...z] = ["a"];
x // "a"
y // "undefined"
z // []

 如果解析不成功,变量的值就会变成 undefined.

var [foo] = [];
var [bar, foo] = [1];

 以上两种情况都属于解构不成功,foo的值都会等于undefined.

另一种情况是不完全解构,即左边的模式只匹配等号右边数组的一部分。这种情况下,解构依然可以成功。

let [x, y] = [1, 2, 3];
x // 1
y // 2

let [a, [b],d]] = [1, [2, 3], 4];
a // 1;
b // 2
c // 4
上面的例子都属于不完全解构,但是可以成功。
如果等号的右边不是数组(或者严格说,不是可便利的结构),那么将会报错。
// 报错
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};

默认值

解构赋值允许指定默认值。

var [foo = true] = [];
foo // true

[x, y = "b"] = ["a"]; // x = "a", y = "b"
[x, y = "b"] = ["a", undefined] // x = "a", y = "b";

主要ES6内部使用严格相等符(===)判断一个位置是否有值。所以如果一个数组成员不严格等于undefined,默认值是不会生效的。
var [x, y] = [undefined];
x //1;

var [x = 1] = [null]
x // null
上面的代码中,如果一个数组成员是null,默认值就不会生效,因为null不严格等于undefined.
如果默认值是一个表达式,那么这个表达式是惰性求值,即只有在用到的时候才会求值

function f() {
  console.log("aaa");
}

let [x = f()] = [1];

上面的代码因为x能取到值,所以函数f根本不会执行。上面的代码其实等价与以下代码。

let x;
if ([1][0] === undefined) {
    x = f();
} else {
   x = [1][0]
}

默认值可以引用解构赋值的其他变量,但该变量必须已经声明。
let [x = 1, y = x] = []; // x = 1; y = 1
let [x = 1, y = x] = [2] // x = 2; y = 2
let [x = y, y = 1] = []; // ReferenceError

 上面的最后一个表达式之所以会报错,是因为 x用到默认值y时y还没有声明。

猜你喜欢

转载自www.cnblogs.com/qjuly/p/8975102.html