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

解構(gòu)賦值
解構(gòu)賦值主要分為對(duì)象的解構(gòu)和數(shù)組的解構(gòu),在沒(méi)有解構(gòu)賦值的時(shí)候盒犹,我們賦值是這樣的

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

這樣寫很繁瑣懂更,那么我們有沒(méi)辦法既聲明,又賦值急膀,更優(yōu)雅的寫法呢沮协?肯定是有的,那就是解構(gòu)賦值卓嫂,解構(gòu)賦值皂股,簡(jiǎn)單理解就是等號(hào)的左邊和右邊相等。
一命黔、數(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í)候呜呐,數(shù)據(jù)并非一一對(duì)應(yīng)的,并且我們希望得到一個(gè)默認(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è)例子可以看出悍募,在解構(gòu)賦值的過(guò)程中蘑辑,a=undefined時(shí),會(huì)使用默認(rèn)值
那么當(dāng)a=null時(shí)呢坠宴?當(dāng)a=null時(shí)洋魂,那么a就不會(huì)使用默認(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ù)組的克隆
// 假如我們簡(jiǎn)單地把一個(gè)數(shù)組賦值給另外一個(gè)變量
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]

因?yàn)檫@只是簡(jiǎn)單的把引用地址賦值給b喜鼓,而不是重新開(kāi)辟一個(gè)內(nèi)存地址副砍,所以
a和b共享了同一個(gè)內(nèi)存地址,該內(nèi)存地址的更改庄岖,會(huì)影響到所有引用該地址的變量
那么用下面的方法豁翎,把數(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]

二隅忿、對(duì)象的解構(gòu)賦值
對(duì)象的解構(gòu)賦值和數(shù)組的解構(gòu)賦值其實(shí)類似心剥,但是數(shù)組的數(shù)組成員是有序的
而對(duì)象的屬性則是無(wú)序的邦尊,所以對(duì)象的解構(gòu)賦值簡(jiǎn)單理解是等號(hào)的左邊和右邊的結(jié)構(gòu)相同

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

對(duì)象的解構(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
// 需要用圓括號(hào)畦娄,包裹起來(lái)
({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時(shí)熙卡,則會(huì)使用默認(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ù)量時(shí)挺勿,是通過(guò)arguments來(lái)獲取的

function sum() {
  console.log(arguments) // { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5, '5': 6 }
                         // 我們可以看出,arguments不是一個(gè)數(shù)組喂柒,而是一個(gè)偽數(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

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

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

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

得到的args是一個(gè)數(shù)組不瓶,直接對(duì)數(shù)組進(jìn)行操作會(huì)比對(duì)偽數(shù)組進(jìn)行操作更加方便,還有一些注意點(diǎn)需要注意

// 正確的寫法 擴(kuò)展運(yùn)算符只能放在最后一個(gè)參數(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)

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

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

我們可以對(duì)比下擴(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 ]
// 以往我們這樣來(lái)取數(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]展開(kāi)為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] // 報(bào)錯(cuò) 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]

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

// 以往我們這樣合并對(duì)象
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 }

需要注意的是蚊丐,通過(guò)擴(kuò)展運(yùn)算符和Object.assign對(duì)對(duì)象進(jìn)行合并的行為,是屬于淺拷貝艳吠,那么我們?cè)陂_(kāi)發(fā)當(dāng)中麦备,經(jīng)常需要對(duì)對(duì)象進(jìn)行深拷貝,接下來(lái)我們看看如何進(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: [ '小黃' ] }
// 此時(shí)我們新增swr的屬性
swr.pets.push('旺財(cái)')
console.log(swr) // { name: '邵威儒', age: 28, pets: [ '小黃', '旺財(cái)' ] }
// 但是swrcopy卻不會(huì)受swr影響
console.log(swrcopy) // { name: '邵威儒', age: 28, pets: [ '小黃' ] }

這種方式進(jìn)行深拷貝凛篙,只針對(duì)json數(shù)據(jù)這樣的鍵值對(duì)有效
對(duì)于函數(shù)等等反而無(wú)效,不好用栏渺,接著繼續(xù)看方法二呛梆、三。

方法二

function deepCopy(fromObj,toObj) { // 深拷貝函數(shù)
  // 容錯(cuò)
  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'){ // 是否為對(duì)象
      toObj[key] = fromObj[key] // 如果為普通值磕诊,則直接賦值
    }else{
      if(fromObj[key] === null){
        toObj[key] = null
      }else{
        toObj[key] = new fromObj[key].constructor // 如果為object填物,則new這個(gè)object指向的構(gòu)造函數(shù)
        deepCopy(fromObj[key],toObj[key]) // 遞歸          
      }
    }
  }
  return toObj
}

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

let dogcopy = deepCopy(dog)
// 此時(shí)我們把dog的屬性進(jìn)行增加
dog.firends.push({name:"小紅",sex:"母"})
console.log(dog) // { name: '小白',
                      sex: '公',
                      firends: [ { name: '小黃', sex: '母' }, { name: '小紅', sex: '母' } ] }
// 當(dāng)我們打印dogcopy,會(huì)發(fā)現(xiàn)dogcopy不會(huì)受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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末霎终,一起剝皮案震驚了整個(gè)濱河市滞磺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌莱褒,老刑警劉巖击困,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異保礼,居然都是意外死亡沛励,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門炮障,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)目派,“玉大人,你說(shuō)我怎么就攤上這事胁赢∑蟛洌” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵智末,是天一觀的道長(zhǎng)谅摄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)系馆,這世上最難降的妖魔是什么送漠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮由蘑,結(jié)果婚禮上闽寡,老公的妹妹穿的比我還像新娘。我一直安慰自己尼酿,他們只是感情好爷狈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著裳擎,像睡著了一般涎永。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹿响,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天羡微,我揣著相機(jī)與錄音,去河邊找鬼惶我。 笑死拷淘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的指孤。 我是一名探鬼主播启涯,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼恃轩!你這毒婦竟也來(lái)了结洼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叉跛,失蹤者是張志新(化名)和其女友劉穎松忍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體筷厘,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸣峭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年宏所,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摊溶。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爬骤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莫换,到底是詐尸還是另有隱情霞玄,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布拉岁,位于F島的核電站坷剧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏喊暖。R本人自食惡果不足惜惫企,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陵叽。 院中可真熱鬧雅任,春花似錦、人聲如沸咨跌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锌半。三九已至禽车,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刊殉,已是汗流浹背殉摔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留记焊,地道東北人逸月。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像遍膜,于是被迫代替她去往敵國(guó)和親碗硬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • 原文鏈接:小邵教你玩轉(zhuǎn)ES6 解構(gòu)賦值 解構(gòu)賦值主要分為對(duì)象的解構(gòu)和數(shù)組的解構(gòu)瓢颅,在沒(méi)有解構(gòu)賦值的時(shí)候恩尾,我們賦值是這...
    alanwhy閱讀 34,018評(píng)論 0 41
  • 概述 解構(gòu)賦值是對(duì)賦值運(yùn)算符的擴(kuò)展。他是一種針對(duì)數(shù)組或者對(duì)象進(jìn)行模式匹配挽懦,然后對(duì)其中的變量進(jìn)行賦值翰意。在代碼書(shū)寫上簡(jiǎn)...
    遼A丶孫悟空閱讀 505評(píng)論 1 11
  • 一、函數(shù)的默認(rèn)參數(shù) ES6 之前,不能直接為函數(shù)的參數(shù)指定默認(rèn)值冀偶,只能采用變通的方法醒第。 ES6 允許為函數(shù)的參數(shù)設(shè)...
    _ClariS_閱讀 615評(píng)論 0 2
  • 解構(gòu)賦值是對(duì)賦值運(yùn)算符的擴(kuò)展。 他是一種針對(duì)數(shù)組或者對(duì)象進(jìn)行模式匹配进鸠,然后對(duì)其中的變量進(jìn)行賦值稠曼。 在代碼書(shū)寫上簡(jiǎn)潔...
    yezi1004閱讀 304評(píng)論 0 0
  • 概述 解構(gòu)賦值是對(duì)賦值運(yùn)算符的擴(kuò)展。他是一種針對(duì)數(shù)組或者對(duì)象進(jìn)行模式匹配堤如,然后對(duì)其中的變量進(jìn)行賦值蒲列。在代碼書(shū)寫上簡(jiǎn)...
    KingWorld閱讀 284評(píng)論 0 0