1. 程式人生 > >es6--變量的解構賦值

es6--變量的解構賦值

表達 element ... ava 進行 解構賦值 .get java 獲取元素

基本用法:

以前為變量賦值只能直接指定值;

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還沒有聲明。

註:
[1] 是只含元素 1 的數組
[0] 是取數組的第 0 個元素
[1][0] 的結果就是 1 拉
[1][0] === undefined 只是個條件判斷而已,即 1 === undefined

es6--變量的解構賦值