国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

解構賦值是深拷貝嗎?

William_Sang / 753人閱讀

摘要:最近在使用想到一個問題,里常用的一種語法是這樣的通過解構賦值保留了里未修改的部分,并覆蓋修改的部分,那么現在問題來了,這里的新對象通過解構得來的,是否是原來屬性的引用賦值呢我們知道,如下情況這里是的一個引用賦值。比如上例中希望可以幫助大家。

最近在使用Redux想到一個問題,Redux里常用的一種語法是這樣的:

setSth(state, { payload }) {
    const { newthing} = payload;
    return {
        ...state,
        newthing
    }
}

Redux通過解構賦值...state,保留了state里未修改的部分,并覆蓋修改的部分,那么現在問題來了,這里的新對象通過解構得來的...state,是否是原來屬性的引用賦值呢?

我們知道,如下情況:

let state = {a: 1, b: 2}
let state2 = state;
state2.a = 5;
// state.a === 5 => true

這里state2是state的一個引用賦值。
那么使用解構賦值生成一個新對象會如何呢?

let state = {a: 1, b: 2}
let state2 = { ...state }
state2.a = 5;
// state.a === 1 => true

通過實驗可見,state2屬性的修改并沒有影響到state,所以這是一份拷貝,那么問題又來了,這個拷貝是只有一層的淺拷貝,還是遞歸進去的深拷貝呢,我直覺地認為是深拷貝,于是又做了一個實驗:

let state = {a: {a1: 1, a2: 2}, b: 2}
let state2 = { ...state }
state2.a.a1 = 5;
// state.a.a1 === 5 => true

事實證明我的直覺錯了,解構復制到全新對象里只是淺拷貝,對象里屬性的屬性還是對原來對象里屬性的屬性的一個引用,因為解構賦值可以生成一份淺拷貝,其實我們針對已知結構的對象也可以全部使用這個方法實現自己想要的拷貝。比如上例中:

let state = {a: {a1: 1, a2: 2}, b: 2}
let state2 = { ...state, a: { ...state.a } }

希望可以幫助大家。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/103650.html

相關文章

  • es6中容易忽視的細節(二)

    摘要:變量的解構賦值結構賦值允許使用默認值內部使用嚴格相等運算符,判斷一個位置是否有值。所以,只有當一個數組成員嚴格等于,默認值才會生效。這樣的層層判斷非常麻煩,因此現在有一個提案,引入了傳導運算符,簡化上面的寫法。 變量的解構賦值 結構賦值允許使用默認值 let [foo = true] = []; foo // true ES6 內部使用嚴格相等運算符(===),判斷一個位置是否...

    RayKr 評論0 收藏0
  • ES6學習(二)之解構賦值及其原理

    摘要:基本原理解構是提供的語法糖,其實內在是針對可迭代對象的接口,通過遍歷器按順序獲取對應的值進行賦值。屬性值返回一個對象的無參函數,被返回對象符合迭代器協議。迭代器協議定義了標準的方式來產生一個有限或無限序列值。 更多系列文章請看 1、基本語法 1.1、數組 // 基礎類型解構 let [a, b, c] = [1, 2, 3] console.log(a, b, c) // 1, 2, ...

    chunquedong 評論0 收藏0
  • JS 里的類型

    摘要:中是確定的,是的引用后面,變成的引用,但中的是確定的,所以在中又加上了深拷貝方法方法一如果這樣寫,對象中的簡單類型是深拷貝,而復雜類型是簡單拷貝方法二循環引用垃圾回收如果一個對象沒有被引用,它就是垃圾,將被引用被賦值后,這個函數不是垃圾 JS 里的類型 number類型轉 `string`:`toString`、String()全局函數、加上空字符串 `boolean:Boolean(...

    calx 評論0 收藏0
  • ES6(中)

    摘要:它用來比較兩個值是否嚴格相等,與嚴格比較運算符的行為基本一致。兩個對象的地址不一樣與嚴格比較運算符的不同之處只有兩個一是不等于,二是等于自身基本用法方法用于對象的合并,將源對象的所有可枚舉屬性,賦值到目標對象。 這是ES6的入門篇教程的筆記,網址:鏈接描述,以下內容中粗體+斜體表示大標題,粗體是小標題,還有一些重點;斜體表示對于自身,還需要下功夫學習的內容。這里面有一些自己的見解,所以...

    dreamGong 評論0 收藏0
  • 深淺拷貝

    摘要:好像栗子不是那么好吃,那我們來看看下面的解釋吧深淺拷貝深拷貝和淺拷貝只針對像這樣的引用類型數據。深拷貝則是開啟一個新的棧,兩個對象對應兩個不同的引用地址,修改一個對象的屬性,不會改變另一個對象的屬性。 拷貝顧名思義就是復制,但是它并不簡單哦,拷貝分為深淺拷貝,那么啥是深拷貝啥是淺拷貝呢,讓我們來舉個栗子,淺拷貝就是當你拷貝別人的U盤里東西時,卻沒有新建文件存放在自己的電腦里,直接在里面...

    yck 評論0 收藏0

發表評論

0條評論

William_Sang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<