es6允許按照一定的模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構。
var [a,b,c]=[1,2,3];可以從陣列中提取值,按照位置的對應關係對變數賦值。本質上,這種寫法屬於「模式匹配」,只要等號兩邊的模式相同,左邊的變數就會被賦予對應的值。如果解構不成功,變數的值就等於undefined。另一種情況是不完全解構,即等號左邊的模式只匹配等號右邊陣列的一部分。這種情況下,解構依然可以成功。
解構賦值不僅適用於var命令,也適用於let和const命令。
解構賦值允許指定預設值。es6內部使用嚴格相等運算子(===)判斷乙個位置是否有值。所以,如果乙個陣列成員不嚴格等於undefined,預設值是不會生效的。如果乙個陣列成員是null,預設值就不會生效,因為null不嚴格等於undefined。
物件的解構與陣列有乙個重要的不同。陣列的元素是按次序排列的,變數的取值由它的位置決定;而物件的屬性沒有次序,變數必須與屬性同名,才能取到正確的值。如果變數名與屬性名不一致,必須寫成下面這樣:let =,f//1,l//2。這實際上說明,物件的解構賦值是以下形式的簡寫。let =.也就是說,物件的解構賦值的內部機制,是先找到同名屬性,然後再賦給對應的變數。真正被賦值的是後者,而不是前者。
解構賦值的變數都會重新宣告,假如使用var命令不會報錯。物件的解構也可以指定預設值。預設值生效的條件是,物件的屬性值嚴格等於undefined。
如果解構失敗,變數的值等於undefined。
如果解構模式是巢狀的物件,而且子物件所在的父屬性不存在,那麼將會報錯。這是因為父屬性是undefined,再取子屬性就會報錯。
字串也可以解構賦值。這是因為,此時字串被轉換成了乙個類似陣列的物件。類似陣列的物件都有length屬性,因此還可以對這個屬性的解構賦值。
解構賦值的規則是,只要等號右邊的值不是物件,就先將其轉換為物件。由於undefined和null無法轉為物件,所以對它們進行解構賦值都會報錯。
函式的引數也可以解構賦值。函式引數的解構也可以使用預設值。
function move()move()//
5move()//
3
只要有可能,就不要在模式中放置圓括號。
變數宣告語句中,模式不能帶有圓括號。函式引數中,模式也不能帶有圓括號。不能將整個模式或巢狀模式中的一層放在圓括號中。
可以使用圓括號的情況只有一種:賦值語句的非模式部分可以使用圓括號。
變數的解構賦值用途很多。
[x,y]=[y,x];**交換了變數x和y的值,這個寫法比用中間值來切換好多了。
函式只能返回乙個值,如果返回多個值,只能將其放在陣列或物件中返回。有了解構賦值,取出這些值就很方便。return [1,2,3];var [a,b,c]=func();
函式引數的定義。解構賦值可以方便地將一組引數與變數名對應起來。引數是有序的情況下用陣列,無序的情況下用物件。
解構賦值對提取json物件中的資料尤其有用。
函式引數的預設值。這就避免了在函式體內部再寫var foo=config.foo||'default foo';
遍歷map結構。for(let [key] of map){}
輸入模組的指定方法。沒用過。
解構賦值 陣列的解構賦值
什麼是解構賦值?es6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構 destructuring 我的理解是 允許宣告一種模式 陣列 物件等 裡面包含乙個或多個變數,再分別對這些變數遍歷 按照對應位置 賦值。以前,為變數賦值,只能直接指定值。let a 1 let b 2 通...
陣列的解構賦值
es6允許按照一定的模式,從陣列和物件中提取值,對變數進行賦值,這被稱之為解構 destructuring 以前為變數賦值,只能直接指定值 var a 1 var b 2 var c 3 es6允許寫成這樣 var a,b,c 1,2,3 本質上,這種寫法屬於 模式匹配 只要等號兩邊的模式相同,左邊...
解構賦值的用途
變數的解構賦值用途很多。1 交換變數的值 let x 1 let y 2 x,y y,x 上面 交換變數x和y的值,這樣的寫法不僅簡潔,而且易讀,語義非常清晰。2 從函式返回多個值 函式只能返回乙個值,如果要返回多個值,只能將它們放在陣列或物件裡返回。有了解構賦值,取出這些值就非常方便。返回乙個陣列...