ES6——解構(gòu)賦值

原文鏈接:小邵教你玩轉(zhuǎn)ES6

解構(gòu)賦值

解構(gòu)賦值主要分為對象的解構(gòu)和數(shù)組的解構(gòu)息罗,在沒有解構(gòu)賦值的時候,我們賦值是這樣的

let arr = [0,1,2]
let a = arr[0]
let b = arr[1]
let c = arr[2]

這樣寫很繁瑣洪鸭,那么我們有沒辦法既聲明挡毅,又賦值蒜撮,更優(yōu)雅的寫法呢?肯定是有的慷嗜,那就是解構(gòu)賦值淀弹,解構(gòu)賦值,簡單理解就是等號的左邊和右邊相等庆械。

一薇溃、數(shù)組的解構(gòu)賦值

let arr = [0,1,2]
let [a,b,c] = arr
console.log(a) // 0
console.log(b) // 1
console.log(c) // 2

但是很多時候,數(shù)據(jù)并非一一對應(yīng)的缭乘,并且我們希望得到一個默認(rèn)值

let arr = [,1,2]
let [a='我是默認(rèn)值',b,c] = arr
console.log(a) // '我是默認(rèn)值'
console.log(b) // 1
console.log(c) // 2

從這個例子可以看出沐序,在解構(gòu)賦值的過程中,a=undefined時堕绩,會使用默認(rèn)值
那么當(dāng)a=null時呢策幼?當(dāng)a=null時,那么a就不會使用默認(rèn)值奴紧,而是使用null

// 數(shù)組的拼接
let a = [0,1,2]
let b = [3,4,5]
let c = a.concat(b)
console.log(c) // [0,1,2,3,4,5]

let d = [...a,...b]
console.log(d) // [0,1,2,3,4,5]
// 數(shù)組的克隆
// 假如我們簡單地把一個數(shù)組賦值給另外一個變量
let a = [0,1,2,3]
let b = a
b.push(4)
console.log(a) // [0,1,2,3,4]
console.log(b) // [0,1,2,3,4]

因為這只是簡單的把引用地址賦值給b特姐,而不是重新開辟一個內(nèi)存地址,所以
a和b共享了同一個內(nèi)存地址黍氮,該內(nèi)存地址的更改唐含,會影響到所有引用該地址的變量
那么用下面的方法,把數(shù)組進(jìn)行克隆一份沫浆,互不影響

let a = [0,1,2,3]
let b = [...a]
b.push(4)
console.log(a) // [0,1,2,3]
console.log(b) // [0,1,2,3,4]

二捷枯、對象的解構(gòu)賦值

對象的解構(gòu)賦值和數(shù)組的解構(gòu)賦值其實類似,但是數(shù)組的數(shù)組成員是有序的
而對象的屬性則是無序的专执,所以對象的解構(gòu)賦值簡單理解是等號的左邊和右邊的結(jié)構(gòu)相同

let {name,age} = {name:"swr",age:28}
console.log(name) // 'swr'
console.log(age) // 28

對象的解構(gòu)賦值是根據(jù)key值進(jìn)行匹配

// 這里可以看出淮捆,左側(cè)的name和右側(cè)的name,是互相匹配的key值
// 而左側(cè)的name匹配完成后本股,再賦值給真正需要賦值的Name
let { name:Name,age } = { name:'swr',age:28 }
console.log(Name) // 'swr'
console.log(age) // 28

那么當(dāng)變量已經(jīng)被聲明了呢攀痊?

let name,age
// 需要用圓括號,包裹起來
({name,age} = {name:"swr",age:28})
console.log(name) // 'swr'
console.log(age) // 28

變量能否也設(shè)置默認(rèn)值拄显?

let {name="swr",age} = {age:28}
console.log(name) // 'swr'
console.log(age) // 28
// 這里規(guī)則和數(shù)組的解構(gòu)賦值一樣蚕苇,當(dāng)name = undefined時,則會使用默認(rèn)值
let [a] = [{name:"swr",age:28}]
console.log(a) // {name:"swr",age:28}

let { length } = "hello swr"
console.log(length) // 9
function ajax({method,url,type='params'}){
    console.log(method) // 'get'
    console.log(url) // '/'
    console.log(type) // 'params'
}

ajax({method:"get",url:"/"})

三凿叠、擴(kuò)展運(yùn)算符

我們先看下代碼,在以往,我們給函數(shù)傳不確定參數(shù)數(shù)量時盒件,是通過arguments來獲取的

function sum() {
  console.log(arguments) // { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5, '5': 6 }
                         // 我們可以看出蹬碧,arguments不是一個數(shù)組,而是一個偽數(shù)組
  let total = 0
  let { length } = arguments
  for(let i = 0;i < length;i++){
    total += arguments[i]
  }
  return total
}

console.log(sum(1,2,3,4,5,6)) // 21

接下來我們用擴(kuò)展運(yùn)算符看看

function sum(...args){ // 使用...擴(kuò)展運(yùn)算符
    console.log(args) // [ 1, 2, 3, 4, 5, 6 ] args是一個數(shù)組
    return eval(args.join('+'))
}

console.log(sum(1,2,3,4,5,6)) // 21

得到的args是一個數(shù)組炒刁,直接對數(shù)組進(jìn)行操作會比對偽數(shù)組進(jìn)行操作更加方便恩沽,還有一些注意點需要注意

// 正確的寫法 擴(kuò)展運(yùn)算符只能放在最后一個參數(shù)
function sum(a,b,...args){
    console.log(a) // 1
    console.log(b) // 2
    console.log(args) // [ 3, 4, 5, 6 ]
}

sum(1,2,3,4,5,6)

// 錯誤的寫法 擴(kuò)展運(yùn)算符只能放在最后一個參數(shù)
function sum(...args,a,b){
    // 報錯
}

sum(1,2,3,4,5,6)

我們可以對比下擴(kuò)展運(yùn)算符的方便之處

// 以往我們是這樣拼接數(shù)組的
let arr1 = [1,2,3]
let arr2 = [4,5,6]
let arr3 = arr1.concat(arr2)
console.log(arr3) // [ 1, 2, 3, 4, 5, 6 ]

// 現(xiàn)在我們用擴(kuò)展運(yùn)算符看看
let arr1 = [1,2,3]
let arr2 = [4,5,6]
let arr3 = [...arr1,...arr2]
console.log(arr3) // [ 1, 2, 3, 4, 5, 6 ]
// 以往我們這樣來取數(shù)組中最大的值
function max(...args){
    return Math.max.apply(null,args)
}
console.log(max(1,2,3,4,5,6)) // 6

// 現(xiàn)在我們用擴(kuò)展運(yùn)算符看看
function max(...args){
    return Math.max(...args) // 把a(bǔ)rgs [1,2,3,4,5,6]展開為1,2,3,4,5,6
}
console.log(max(1,2,3,4,5,6)) // 6
// 擴(kuò)展運(yùn)算符可以把a(bǔ)rgument轉(zhuǎn)為數(shù)組
function max(){
    console.log(arguments) // { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5, '5': 6 }
    let arr = [...arguments]
    console.log(arr) // [1,2,3,4,5,6]
}

max(1,2,3,4,5,6)

// 但是擴(kuò)展運(yùn)算符不能把偽數(shù)組轉(zhuǎn)為數(shù)組(除了有迭代器iterator的偽數(shù)組,如arguments)
let likeArr = { "0":1,"1":2,"length":2 }
let arr = [...likeArr] // 報錯 TypeError: likeArr is not iterable

// 但是可以用Array.from把偽數(shù)組轉(zhuǎn)為數(shù)組
let likeArr = { "0":1,"1":2,"length":2 }
let arr = Array.from(likeArr)
console.log(arr) // [1,2]

對象也可以使用擴(kuò)展運(yùn)算符

// 以往我們這樣合并對象
let name = { name:"邵威儒" }
let age = { age:28 }
let person = {}
Object.assign(person,name,age)
console.log(person) // { name: '邵威儒', age: 28 }

// 使用擴(kuò)展運(yùn)算符
let name = { name:"邵威儒" }
let age = { age:28 }
let person = {...name,...age}
console.log(person) // { name: '邵威儒', age: 28 }

需要注意的是翔始,通過擴(kuò)展運(yùn)算符和Object.assign對對象進(jìn)行合并的行為罗心,是屬于淺拷貝,那么我們在開發(fā)當(dāng)中城瞎,經(jīng)常需要對對象進(jìn)行深拷貝渤闷,接下來我們看看如何進(jìn)行深拷貝

方法一:利用JSON.stringify和JSON.parse
let swr = {
    name:"邵威儒",
    age:28,
    pets:['小黃']
}

let swrcopy = JSON.parse(JSON.stringify(swr))
console.log(swrcopy) // { name: '邵威儒', age: 28, pets: [ '小黃' ] }
// 此時我們新增swr的屬性
swr.pets.push('旺財')
console.log(swr) // { name: '邵威儒', age: 28, pets: [ '小黃', '旺財' ] }
// 但是swrcopy卻不會受swr影響
console.log(swrcopy) // { name: '邵威儒', age: 28, pets: [ '小黃' ] }

這種方式進(jìn)行深拷貝脖镀,只針對json數(shù)據(jù)這樣的鍵值對有效
對于函數(shù)等等反而無效飒箭,不好用,接著繼續(xù)看方法二蜒灰、三弦蹂。

方法二
function deepCopy(fromObj,toObj) { // 深拷貝函數(shù)
  // 容錯
  if(fromObj === null) return null // 當(dāng)fromObj為null
  if(fromObj instanceof RegExp) return new RegExp(fromObj) // 當(dāng)fromObj為正則
  if(fromObj instanceof Date) return new Date(fromObj) // 當(dāng)fromObj為Date

  toObj = toObj || {}
  
  for(let key in fromObj){ // 遍歷
    if(typeof fromObj[key] !== 'object'){ // 是否為對象
      toObj[key] = fromObj[key] // 如果為普通值,則直接賦值
    }else{
      if(fromObj[key] === null){
        toObj[key] = null
      }else{
        toObj[key] = new fromObj[key].constructor // 如果為object强窖,則new這個object指向的構(gòu)造函數(shù)
        deepCopy(fromObj[key],toObj[key]) // 遞歸          
      }
    }
  }
  return toObj
}

let dog = {
  name:"小白",
  sex:"公",
  firends:[
    {
      name:"小黃",
      sex:"母"
    }
  ]
}

let dogcopy = deepCopy(dog)
// 此時我們把dog的屬性進(jìn)行增加
dog.firends.push({name:"小紅",sex:"母"})
console.log(dog) // { name: '小白',
                      sex: '公',
                      firends: [ { name: '小黃', sex: '母' }, { name: '小紅', sex: '母' } ] }
// 當(dāng)我們打印dogcopy凸椿,會發(fā)現(xiàn)dogcopy不會受dog的影響
console.log(dogcopy) // { name: '小白',
                          sex: '公',
                          firends: [ { name: '小黃', sex: '母' } ] }
方法三
let dog = {
  name:"小白",
  sex:"公",
  firends:[
    {
      name:"小黃",
      sex:"母"
    }
  ]
}

function deepCopy(obj) {
  if(obj === null) return null
  if(typeof obj !== 'object') return obj
  if(obj instanceof RegExp) return new RegExp(obj)
  if(obj instanceof Date) return new Date(obj)
  let newObj = new obj.constructor
  for(let key in obj){
    newObj[key] = deepCopy(obj[key])
  }
  return newObj
}

let dogcopy = deepCopy(dog)
dog.firends.push({name:"小紅",sex:"母"})
console.log(dogcopy)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市翅溺,隨后出現(xiàn)的幾起案子脑漫,更是在濱河造成了極大的恐慌,老刑警劉巖未巫,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窿撬,死亡現(xiàn)場離奇詭異,居然都是意外死亡叙凡,警方通過查閱死者的電腦和手機(jī)劈伴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來握爷,“玉大人,你說我怎么就攤上這事新啼。” “怎么了燥撞?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵迷帜,是天一觀的道長。 經(jīng)常有香客問我色洞,道長戏锹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任锦针,我火速辦了婚禮,結(jié)果婚禮上奈搜,老公的妹妹穿的比我還像新娘。我一直安慰自己盯荤,他們只是感情好馋吗,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著廷雅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪航缀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天芥玉,我揣著相機(jī)與錄音,去河邊找鬼灿巧。 笑死,一個胖子當(dāng)著我的面吹牛抠藕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盾似,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼零院!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起撰茎,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤打洼,失蹤者是張志新(化名)和其女友劉穎龄糊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绎签,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搔扁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡扭勉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苛聘,到底是詐尸還是另有隱情涂炎,我是刑警寧澤设哗,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站网梢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏战虏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一烦感、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧手趣,春花似錦、人聲如沸回懦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舟茶,卻和暖如春堵第,著一層夾襖步出監(jiān)牢的瞬間隧出,已是汗流浹背踏志。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工胀瞪, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凄诞。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像帆谍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子汛蝙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 前面的話 我們經(jīng)常定義許多對象和數(shù)組,然后有組織地從中提取相關(guān)的信息片段坚洽。在ES6中添加了可以簡化這種任務(wù)的新特性...
    sunnyghx閱讀 756評論 0 0
  • 1.在指定默認(rèn)值時苛吱,賦值為<code>null</code>和<code>undefined</code>是不同的...
    請輸入其他名字閱讀 1,739評論 0 0
  • 魯?shù)婪虻吕卓怂归_創(chuàng)性地將阿德勒的精神分析法和個體心理學(xué)發(fā)展為一系列實踐方法,直接影響了正面管教翠储,父母PET效能等方...
    只愿青箏伴此生閱讀 122評論 0 0
  • 要說親戚,真是這世界上最頭疼的難題了援所,永遠(yuǎn)只能舔著臉樂哈哈地相處著。若是親戚有事住拭,你不但要幫,還得上桿子熱情洋溢吹...
    木芥子閱讀 281評論 2 1
  • 需求: 需要在數(shù)據(jù)中添加字段谱煤,設(shè)置字段自增長 實現(xiàn)方式: 1、判斷表中是否存在改字段刘离,如果不存在則添加 2睹栖、在sq...
    命運(yùn)建筑師fly閱讀 3,537評論 0 5