陣列 物件的轉殖(包括深 淺轉殖)

2021-09-24 14:27:28 字數 2577 閱讀 4333

let arr1 = [3,4,5,6,]

let arr2 = arr1.concat()

arr2[0] = 110

arr2[4].user = 'liu'

console.log(arr1) // [3,4,5,6, ] // 裡面的物件跟著改變了

console.log(arr2) // [110,4,5,6,

let arr1 = [3,4,5,6,]

let arr2 = arr1.slice()

arr2[0] = 110

arr2[4].user = 'liu'

console.log(arr1) // [3,4,5,6, ]

console.log(arr2) // [110,4,5,6, ]

這個方法如果需要做到相容性比較好的話需要借助josn官網下的json2.js這個外掛程式來相容html5的json方法(parse()和stringify()方法),直接將這個外掛程式引入即可

這種方式拷貝的資料裡不能有函式,因為不能處理函式資料,如果拷貝的資料裡有函式,拷貝完的結果這個函式變成了null,因為json.stringify()這個方法裡只能是原生js的obj或者陣列

let arr1 = [3,4,5,6, function fun() {}]

let arr2 = json.parse(json.stringify(arr1))

console.log(arr1) // [3, 4, 5, 6, ƒ] f就是最後乙個元素

console.log(arr2) //[3, 4, 5, 6, null]

原理:首先使用window.josn來判斷瀏覽器支不支援html5中的josn的方法,如果支援則使用josn的方法,如果不支援那麼使用原生js實現深度轉殖的方法(使用的遞迴演算法)

特點:拷貝的時候生成新的資料,修改拷貝以後的資料不會影響原資料

測試結果:

下面**也是可以包含函式

判斷資料型別的另外一種方式——object.prototype.tostring

let arr = [2, 3, 4, 5, ]

let obj =

// 通過原型方法:object.prototype.tostring,沒有被修改過,最原始的方法

// 利用call的特點讓我們指定的資料去呼叫這個原型方法

let datatype1 = object.prototype.tostring.call(arr)

let datatype2 = object.prototype.tostring.call(obj)

console.log(datatype1) // 列印結果:[object array],資料型別是string,所以可以進行字串切割

console.log(datatype2) // 列印結果:[object object],資料型別是string,所以可以進行字串切割

let datatype3 = datatype1.slice(8, -1) // slice包含開始位置,不包含結束位置,可以倒著數,-1就是最後一位,這個不包含結束位置

let datatype4 = datatype2.slice(8, -1) // slice包含開始位置,不包含結束位置,可以倒著數,-1就是最後一位,這個不包含結束位置

console.log(datatype3) //array

console.log(datatype4) //object

深度拷貝具體實現**

// 檢測資料型別的功能

function checktype(target)

// 實現深度拷貝(陣列/物件)

function clone(target)

} else if (targettype === 'array') else

for (let i in target) else

}return result

} //測試

var student =

};//執行深度轉殖,物件裡面有方法也是可以的

JS陣列的深淺轉殖

陣列的拷貝,通常可以使用乙個新的陣列,指向現有陣列 var arr liuche zhouyafu huoqubing weiqing var arr2 arr arr2.push liguang alert arr liuche zhouyafu huoqubing weiqing liguang...

js物件深淺轉殖及封裝

1.淺轉殖 var obj1 var obj2 obj1 因為obj1 和 obj2 共用乙個位址,回到資料修改的時候彼此出現影響 obj1.a 20 console.log obj2 202.深轉殖 var obj1 var obj2 轉殖 你有什麼我有什麼 先去找到原物件裡面每乙個項資料 for...

物件的轉殖

實體類teacher public class teacher implements cloneable public string getname public void setname string name override public teacher clone throws clonen...