// (1)對陣列變數賦值
let [foo, [[bar], baz]] = [1, [[2], 3]];
foo; // 1
bar; // 2
baz; // 3
let [, , third1] = ["foo", "bar", "baz"];
third1; // "baz"
let [aa, , bb] = [1, 2, 3];
aa; // 1
bb; // 3
let [head, ...tail] = [1, 2, 3, 4];
head; // 1
tail; // [2, 3, 4]
//(2)解構不成功(變數數 > 賦值數) 1.
let [x, y, ...z] = ["a"];
x; // "a"
y; // undefined
z; //
//解構不成功 2.
let [foo1] = ;
let [bar1, foo2] = [1];
foo1; // undefined
bar1; // 1
foo2; // undefined
//(3)解構不完全(變數數 < 賦值數) 1.
let [x1, y1] = [1, 2, 3];
x1; // 1
y1; // 2
//解構不完全 2.
let [a, [b], d] = [1, [2, 3], 4];
a; // 1
b; // 2
d; // 4
//(4)如果等號的右邊不是陣列-->報錯
// let [foo] = 1;
// let [foo] = false;
// let [foo] = nan;
// let [foo] = undefined;
// let [foo] = null;
// let [foo] = {};
//(5) set 結構,也可以使用陣列的解構賦值
let [e, f, g] = new set(["a", "b", "c"]);
e; // "a"
f; // "b"
g; // "c"
// (6) 只要某種資料結構具有 iterator 介面,都可以採用陣列形式的解構賦值。
function* fibs()
}let [first, second, third, fourth, fifth, sixth] = fibs();
sixth; // 5
// (2)es6 內部使用嚴格相等運算子(===),判斷乙個位置是否有值。只有當乙個陣列成員嚴格等於undefined,預設值才會生效。
// (3)預設值是乙個表示式,那麼這個表示式是惰性求值的,即只有在用到的時候,才會求值。
function f()
let [x = f()] = [1];
x;//等價於上面 let [x = f()] = [1];
let y;
if ([1][0] === undefined) else
// (4)預設值可以引用解構賦值的其他變數,但該變數必須已經宣告。
let [c = 1, d = c] = ; // c=1; d=1
let [e = 1, g = e] = [2]; // e=2; g=2
let [h = 1, i = h] = [1, 2]; // h=1; i=2
let [j = k, k = 1] = ; // referenceerror: k is not defined -> k沒有宣告
//(1) 基礎用法
= ; //等價於 let = ;
foo; // "aaa"
bar; // "bbb"
}//(2) 變數名與屬性名不一致:錯誤寫法
= ;foo; // "aaa"
bar; // "bbb"
let = ;
baz; // undefined
}//(3) 變數名與屬性名不一致:正確寫法
= ;baz; // "aaa"
// foo是匹配的模式,baz才是變數。真正被賦值的是變數baz,而不是模式foo。
let obj = ;
let = obj;
f; // 'hello'
l; // 'world'
}//(4) 巢狀結構:陣列一樣,解構也可以用於巢狀結構的物件。 這時p是模式,不是變數,因此不會被賦值]};
let ]
} = obj;
x; // "hello"
y; // "world"
}//(5) 巢狀結構:如果p也要作為變數賦值,可以寫成下面這樣。]};
let ]
} = obj;
x; // "hello"
y; // "world"
p; // ["hello", ]
}//(6) 只有line是變數,loc和start都是模式}};
let ,
loc:
}} = node;
line; // 1
loc; // object
start; // object
}//(7) 巢狀賦值:
;let arr = ;
( = );
obj; //
arr; // [true]
}//(8) 預設值
= {};
x; // 3
var = ;
a; // 1
b; // 5
var = {};
d; // 3
var = ;
f; // 5
var = {};
msg; // "something went wrong"
}//(9) 預設值生效的條件是,物件的屬性值嚴格等於undefined。
= ;x; // 3
var = ;
y; // null
}//(10) 解構失敗
= ;foo; // undefined
}//(11) 巢狀的物件,而且子物件所在的父屬性不存在
// } = ;
//// 對上面的解讀
// let _tmp = ;
// _tmp.foo.bar; // 報錯 _tmp.foo = undefined 再取子屬性就會報錯
}//(12) 已經宣告的變數用於解構賦值
= ; 這裡 被理解為**塊
// 正確的寫法
( = );
console.log(x);
// syntaxerror: syntax error
}//(13) 解構賦值允許等號左邊的模式之中,不放置任何變數名 -> 雖然毫無意義,但是語法是合法的,可以執行。
= [true, false]);
({} = "abc");
({} = );
}//(14) **將math物件的對數、正弦、余弦三個方法,賦值到對應的變數上,使用起來就會方便很多。
let = math;
console.log(sin); //sin()
console.log(pi);
//(15) 由於陣列本質是特殊的物件,因此可以對陣列進行物件屬性的解構。
//上面**對陣列進行物件解構。陣列arr的0鍵對應的值是1,[arr.length - 1]就是2鍵,對應的值是3。方括號這種寫法,屬於「屬性名表示式」
let arr = [1, 2, 3];
let = arr;
first; // 1
last; // 3
ECMAScript中變數的解構賦值
ecmascript中變數的解構賦值 es6 允許從陣列和物件中提取值,對變數進行賦值。解構賦值的基本用法 1 陣列的解構賦值 let a,b,c 1,2,3 console.log a 1 console.log b 2 console.log c 3 2 物件的解構賦值 let console....
ECMA Script 6 變數的解構賦值
1 陣列的結構和賦值 es6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構 2 物件等可以這麼賦值 3 函式引數的解構賦值 function add x,y add 1,2 3 基本用途 交換變數 a,b b,a 函式返回多個值 類似於陣列 返回乙個陣列 function e...
ECMAScript變數訪問與傳遞引數
ecmascript變數包含兩種不同的型別的資料原始值和引用值。原始值就是最簡單的資料 undefined,null,boolean,number,string,symbol 引用值是由多個值構成的物件 object 儲存原始值的變數是按值訪問的,因為我們操作的就是儲存在變數中的實際值。引用值是儲存...