js賦值問題

2022-08-02 02:06:12 字數 1402 閱讀 8843

js、引用、賦值、物件複製、陣列複製等

//

獲取基礎引數列表資料

getedittabledata(event) )

}this.fieldconfdtos=event;

}

今天在用angular做父子元件的一些資料傳遞和處理時發現,子元件通過事件傳給父元件的資料被父元件處理後影響到了子元件。event是子元件傳遞過來的引數,這裡父元件刪除item.key後,發現子元件資料的key也沒了。查閱資料後發現是物件陣列的引用賦值引起的問題。物件賦值問題踩過幾次坑了,這次就系統地記錄一下。

資料型別:

1、基礎資料型別:null、undefined、number、string、boolean

2、物件型別:object、array、function、data

簡單結論:基礎資料型別是原始值可以直接賦值、而物件型別是引用賦值只是賦值指標。

根據實際情況使用淺拷貝或深拷貝。這個內容比較複雜和廣泛,根據具體情況選用合適的方法。參考

常用方法:

1、object.assign()

(1)是物件型別(2)物件的屬性沒有引用型別,即都是基礎資料型別。如},這種資料裡的obj還是引用型別,複製後依然是共用記憶體。(3)其他使用注意事項參考

2、迭代遞迴法 for...in

(1)適用範圍為obj和arry,其他特殊型別不行。

// 判斷是否為物件

function isobject(o)

//測試用例

let test = ,

arr: [0, 1, 2],

func: function() ,

date: new date(0),

reg: new regexp('/我是乙個正則/ig'),

err: new error('我是乙個錯誤')

}// 迭代遞迴法:深拷貝物件與陣列

function deepclone(obj)

//判斷傳進來的是物件還是陣列

let isarray = array.isarray(obj)

let cloneobj = isarray ? : {}

//通過for...in來拷貝

for (let key in obj)

return cloneobj

}let result = deepclone(test)

console.log(result)

//我們發現,arr 和 obj 都深拷貝成功了,它們的記憶體引用已經不同了,但 func、date、reg 和 err 並沒有複製成功,因為它們有特殊的建構函式。

js 賦值問題

var foo var bar foo foo.x foo 輸出foo.x foo.x undefined為什麼呢?先看前面兩句 var foo var bar foo 這兩句的意思是定義了foo為乙個物件,並且讓bar指向這個物件。這很簡單。foo.x foo 等價於 foo.x foo 注意,此...

JS陣列與物件賦值問題

最近有群友遇到乙個問題 就是給陣列賦值遇到的一些問題 正好自己也不了解 就去網上查了一些資料 在這裡做一下總結 問題1 把 a 賦值給 b 改變 b 的值發現 a 的值也被改變了,這和我們想象的不一樣,為什麼呢?1.陣列 var a 1 2 var b a b 0 3 console.log a 3...

js中關於引用變數賦值問題

n個引用變數指向同乙個物件,通過其中乙個變數修改物件內部資料,其它所有變數看到的是修改之後的資料。var obj1 var obj2 obj1 將obj1的內容儲存給obj2 obj1.name jack obj2.age 18 console.log obj2.name jack console....