迅雷面試題 深拷貝物件,除了原型上的屬性?

2021-08-09 01:22:14 字數 4070 閱讀 4251

function

clone

(obj)

return buf;

} else

if (obj instanceof

object); // 建立乙個空物件

for (var k in obj)

return buf;

}else

}//測試

function

o()

function

x()

x.prototype = new o();

x = new x();

var obj = , b : 'b',x:x};

var obj2 = clone(obj);

obj.x.yyy = 'zzz'

console.log(obj2);

console.log(obj2.x.yyy);

以上對嗎,物件x具有原型上的屬性,通過函式clone也深拷貝了原型上的屬性;測試可知

改變物件obj上的原型屬性,obj2不變。

obj.x.yyy = 'zzz'
$ = function

() var key;

for (key in obj)

return key === undefined || hasown.call(obj, key);

},extend = function

(deep, target, options) //為了避免無限迴圈

if (deep && copy

&& (isplainobject(copy) || (copyisarray = array.isarray(copy)))) else ;

}target[name] = extend(deep, clone, copy);

} else

if (copy !== undefined)

}return target;

};return ;

}();

obj1 = ;

obj2 = , y : 'y' };

var combineobj = $.extend(true,obj1,obj2);

console.log(combineobj);

注意:(1)關鍵**是

isplainobject = function

(obj)

var key;

for (key in obj)

return key === undefined || hasown.call(obj, key);

},

(2)把遞迴的寫法搞清楚

//判斷是物件

var isobject = function

(obj)

//判斷是陣列

var isarray = array.isarray || function

(obj)

//獲取物件不在原型上的鍵

var get_keys = function

(obj)

}return keys;

}//實現深拷貝

var deepcopy = function

(obj)else

}}else

if(isobject(obj));

var keys = get_keys(obj);

var length = keys.length ;

for(var i = 0 ; i < length ; i++)

}else

return temp ;

}

注意:(1)主要是hasownproperty的用法:該方法可以檢測乙個屬性是存在於例項中,還是存在於原型中。這個方法只有在只在給定屬性存在於物件例項中時,才會返回true。

(2)第2種和第3種的區別:第2種是只要物件的建構函式不是object,則不進行深拷貝,而第3種是物件的建構函式可以是非object,不深拷貝物件原型上的屬性,只拷貝例項上的屬性。

舉例如下:

function o() 

function x()

x.prototype = new o();

x = new x();

//var obj = , b : 'b',x:x };

var obj = , b : 'b',x:x};

var obj2 = deepcopy(obj);

obj.x.*** = 'zzz'

obj.x.yyy = 'zzz'

console.log("obj ",obj); //, b: 'b', x: o }

console.log("obj2 ",obj2); //, b: 'b', x: }

console.log(obj2.x.***); //*** 已經深拷貝,值不變

console.log(obj2.x.yyy); //

undefined

console.log(x.hasownproperty("***"));//

true

(3)deepcopy函式是直接不拷貝(跳過)相關物件,而$.extend對於不滿足isplainobject的物件,則執行淺拷貝(即target[name] = copy;)。

$ = function

() ,

//對type的注釋:如果obj=null,則返回string(obj),即null,

type = function

(obj) ,

iswindow = function

(obj) ,

//如果瀏覽器有內建的array.isarray 實現,就使用瀏覽器自身的實現方式,否則將物件轉為string,看是否為"[object array]"。(1.這裡所說的將物件轉為string即tostring.call(obj) 2.考慮了相容性 )

isarray = array.isarray || function

(obj) ,

isplainobject = function

(obj)

if (obj.constructor && !hasown.call(obj, "constructor")

&& !hasown.call(obj.constructor.prototype, "isprototypeof"))

var key;

for (key in obj)

return key === undefined || hasown.call(obj, key);

},extend = function

(deep, target, options) //為了避免無限迴圈

//以下if將copy是物件和陣列合併在一起

if (deep && copy

&& (isplainobject(copy) || (copyisarray = isarray(copy)))) else ;

}target[name] = extend(deep, clone, copy);

} else

if (copy !== undefined)

}return target;

};return ;

}();

//測試

function

o()

function

x()

x.prototype = new o();

x = new x();

obj1 = ;

obj2 = , y : 'y' };

var combineobj = $.extend(true,obj1,obj2);

console.log(combineobj);

python面試題 深拷貝與淺拷貝

1.賦值拷貝 2.copy淺拷貝 3.deepcopy深拷貝 import copya 1,2,3,4 賦值拷貝,預設淺拷貝,傳遞物件的引用而已,原始列表改變,被賦值的b也會做相同的改變 b a5 print a,adress id a 1,2,3,4 5 adress 2670537167752 ...

208面試題 物件拷貝

61.為什麼要使用轉殖?想對乙個物件進行處理,又想保留原有的資料進行接下來的操作,就需要轉殖了。轉殖分淺轉殖和深轉殖,淺轉殖後的物件中非基本物件和原物件指向同一塊記憶體,因此對這些非基本物件的修改會同時更改轉殖前後的物件。深轉殖可以實現完全的轉殖,可以用反射的方式或序列化的方式實現。62.如何實現物...

面試題 String類的淺拷貝 深拷貝 寫時拷貝

string的拷貝是面試中的經常會被問到的問題,所以,學懂string類是非常重要的。下面我們先來看一段 class string else string const string s 拷貝建構函式,相當於系統預設合成 pstr s.pstr string operator const string...