對物件與陣列的解構
意義
使用解構操作符,可以更方便的提取物件和陣列中的的單個成員元素
物件解構
- 帶預設值的解構
let person = { name: 'Tom', age: '20' } let { name = 'Eric', age} = person 複製程式碼
- 賦值給本地不同的變數名
let person = { name: 'Tom', age: '20' } let { name:firstName = 'Eric', age:ageOld} = person // 冒號前面的表示要檢索的物件的屬性名;冒號後面的表示要賦值的變數名 console.log(firstName) // Tom console.log(ageOld) // 20 複製程式碼
- 單純的解構賦值,如果當前物件沒有該屬性,可以獲取到物件繼承的屬性
let o = Object.create({a:'1',b:'2'}) //o繼承了{a:'1',b:'2'}物件 let {a} = o console.log(o) //{} console.log(a) //1 複製程式碼
- 解構賦值是淺拷貝,即如果一個鍵的值是複合型別的值(陣列、物件、函式)、那麼解構賦值拷貝的是這個值的引用,而不是這個值的副本
let obj = { a: { b: 1 } }; let { a } = obj; obj.a.b = 3; console.log(a.b) // 3 複製程式碼
物件的擴充套件運算子
- 這是ES2018引入的規則,之前是不支援的
- 擴充套件運算子的解構賦值也是淺拷貝
let obj = { a: { b: 1 } }; let { ...x } = obj; obj.a.b = 3; console.log(x.a.b) // 3 複製程式碼
- 擴充套件運算子後面必須接一個變數,並且放到最後面
let { x, ...{ y, z } } = o; //報語法錯誤 複製程式碼
- 擴充套件運算子的解構賦值,不能複製繼承自原型物件的屬性
const o = Object.create({ x: 1, y: 2 }); o.z = 3; let { x, ...newObj } = o; let { y, z } = newObj; x // 1 普通的物件的解構賦值,可以獲取來自原型物件的屬性 y // undefined 擴充套件運算子的解構賦值取不到原型物件的屬性,因此newObj = {z:3},只有z屬性 z // 3 複製程式碼
陣列解構
- 按照位置依次解構賦值,可以賦預設值
let color = ['red','green','blue'] let [first, second='yellow'] = color console.log(first) // red console.log(second)// green let [ , , third] = color console.log(third) // blue 複製程式碼
- 互換變數名(無需再借助中間變數)
let a= 1, b= 2; [a, b] = [b, a] console.log(a,b) //2,1 複製程式碼
- 使用擴充套件運算子完成剩餘項賦值
常用的應用:陣列的賦值 (傳統的方法是使用 .concat()函式)let color = ['red','green','blue'] let [first, ...restColor] = color //剩餘項必須放在最後面 console.log(first) // red console.log(restColor)// ["green", "blue"] 複製程式碼
let color = ['red','green','blue'] let [...colorArr] = color console.log(colorArr) // ["red", "green", "blue"] 複製程式碼
函式引數解構
function setcookie(name, value, { secure, path, domain, expires= 500 }){
//...
}
// 但這樣寫有個問題,第三個解構的實參必須要傳一個物件,否則解構的{ secure, path, domain, expires= 500 } = undefined 會報錯
setcookie('load','123') //報錯
更完善的寫法是函式引數賦預設值
function setcookie(name, value, { secure, path, domain, expires= 500 } = {}){
//...
}
複製程式碼