淺克隆和深克隆的實作
var tem = "[object Array]";
// 區分物件和陣列
function test() {
if (typeof(arguments[0]) == "object") {
if (Object.prototype.toString.call(arguments[0]) == tem) {
console.log("陣列");
} else {
console.log("物件");
}
} else {
console.log("不是物件");
}
}
function test1() {
if (arguments[0] instanceof Array) {
console.log("陣列");
} else {
console.log("物件");
}
}
var obj = {
name: "abc",
age: 12,
cord: ["2", "3"],
}
var obj1 = {};
//淺拷貝
function clone(origin, target) {
var target = target || {};
for (var prop in origin) {
target[prop] = origin[prop];
}
}
clone(obj, obj1);
// 深度克隆完之后不管是參考值還是原始值的改變都不會影響源物件
// 先判斷是不是原始值 typeof() object
// 判斷是陣列還是物件 instancof Object.prototype.toString.call constructor
// 建立相應的陣列或物件
function deepClone(origin, target) {
var target = target || {},
//用來判斷是陣列還是物件
toStr = Object.prototype.toString,
//存放陣列型別的String
arrStr = "[object Array]";
//遍歷物件
for (var prop in origin) {
//只克隆物件的屬性,不拿他原型鏈上的屬性
if (origin.hasOwnProperty(prop)) {
// 判斷當前是不是物件
if (origin[prop] !== "null" && typeof(origin[prop]) == "object") {
// 是陣列建立一個空陣列是物件建立一個空物件
target[prop] = toStr.call(origin[prop]) == arrStr ? [] : {};
//再次克隆物件內部
deepClone(origin[prop], target[prop]);
} else {
target[prop] = origin[prop];
}
}
}
return target;
}
deepClone(obj, obj1);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/254410.html
標籤:其他
上一篇:js的document.ready是等加載完才執行,但是前面要讀庫的資料慢,導致document.ready不執行怎么辦
