物件解構
如果使用var、let、const解析宣告變數,則必須提供初始化程式(也就是等號右側的值)
以下語句有語法錯誤
var { type, name };
let { type, name }
const { type, name }
解構賦值表示式(也就是右側的表示式)如果為null或undefined會導致程式丟擲錯誤,因為任何嘗試讀取null或undefined的屬性的行為都會觸發執行時錯誤
let node = {
type: `Identifier`,
name: `angela`
}
let { type, name } = node
上面程式碼是宣告type、name變數同時賦值node相應的屬性值
那如果已經存在type、name,重新賦值 使用解構的話則需要在表示式兩側加小括號
let node = {
type: `Identifier`,
name: `angela`
},
type = `demo`,
name = 1;
//新增小括號可以將塊語句轉化為一個表示式,從而實現整個解構賦值的過程
({ type, name } = node)
在任何使用值的地方你都可以使用解構賦值表示式
let node = {
type: `Identifier`,
name: `angela`
},
type = `demo`,
name = 1;
function outputInfo(value) {
console.log(value === node)
}
outputInfo({ type, name } = node)//true
解構還可以使用預設值
let node = {
type: `Identifier`,
name: `angela`
}
let { type, name, value = true } = node
為非同名區域性變數賦值
let node = {
type: `Identifier`
}
let { type: localType, name: localName = "angela" } = node
console.log(localType)//Identifier
console.log(localName)//angela
解構巢狀物件,很可能會無意中建立一個無效表示式,比方說下面的loc後的大括號則不需要,更好的做法是定義一個預設值
let { loc: { } } = node
陣列解構
let colors = [`red`, `green`, `blue`]
let [, , thirdColor] = colors
可以像如上所示只取陣列第三個元素,忽略前兩個
let colors = [`red`, `green`, `blue`],
firstColor = `black`,
secondColor = `purple`;
[firstColor, secondColor] = colors
對變數重新賦值利用解構時,陣列解構不再需要左右兩側加小括號了
可能陣列解構用的最多的莫過於交換值吧
let a = 1,
b = 2;
[a, b] = [b, a]
同樣陣列解構中也可以新增預設值
陣列解構中有一個不定元素的概念,可以通過…語法將陣列中的其餘元素賦值給一個特定的變數
let colors = [`red`, `green`, `blue`];
let [firstColor, ...restColors] = colors//restColors包含兩個元素green和blue
concat方法的設計初衷是連線兩個陣列,如果呼叫時不傳遞引數就會返回當前函式的副本
let colors = [`red`, `green`, `blue`];
let cloneColors = colors.concat() //["red", "green", "blue"]
上述程式碼用ES6中不定元素也可以實現該目標
let colors = [`red`, `green`, `blue`];
let [...cloneColors] = colors //["red", "green", "blue"]
需要注意的是在被解構的陣列中,不定元素必須為最後一個條目,在後面繼續新增逗號會導致語法錯誤
解構引數
function setCookie(name, value, { secure, path, domain, expires }={}) {
}
setCookie("type", "js", { secure: true, expires: 6000 })
想的最全面的就是既使用解構又使用預設值
const setCookieDefaults = {
secure: false,
path: "/",
domain: "example.com",
expires: new Date(Date.now() + 360000000)
}
function setCookie(name, value,
{ secure = setCookieDefaults.secure,
path = setCookieDefaults.path,
domain = setCookieDefaults.domain,
expires = setCookieDefaults.expires }) {
}