摘要:最近在使用想到一個問題,里常用的一種語法是這樣的通過解構賦值保留了里未修改的部分,并覆蓋修改的部分,那么現在問題來了,這里的新對象通過解構得來的,是否是原來屬性的引用賦值呢我們知道,如下情況這里是的一個引用賦值。比如上例中希望可以幫助大家。
最近在使用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
摘要:變量的解構賦值結構賦值允許使用默認值內部使用嚴格相等運算符,判斷一個位置是否有值。所以,只有當一個數組成員嚴格等于,默認值才會生效。這樣的層層判斷非常麻煩,因此現在有一個提案,引入了傳導運算符,簡化上面的寫法。 變量的解構賦值 結構賦值允許使用默認值 let [foo = true] = []; foo // true ES6 內部使用嚴格相等運算符(===),判斷一個位置是否...
摘要:基本原理解構是提供的語法糖,其實內在是針對可迭代對象的接口,通過遍歷器按順序獲取對應的值進行賦值。屬性值返回一個對象的無參函數,被返回對象符合迭代器協議。迭代器協議定義了標準的方式來產生一個有限或無限序列值。 更多系列文章請看 1、基本語法 1.1、數組 // 基礎類型解構 let [a, b, c] = [1, 2, 3] console.log(a, b, c) // 1, 2, ...
閱讀 3091·2023-04-25 15:44
閱讀 1876·2019-08-30 13:11
閱讀 2830·2019-08-30 11:11
閱讀 3004·2019-08-29 17:21
閱讀 1306·2019-08-29 15:38
閱讀 898·2019-08-29 12:49
閱讀 1793·2019-08-28 18:19
閱讀 3222·2019-08-26 14:01