深拷貝的原生js實現


面試時被問到怎么實現深拷貝,想都沒想就用var obj2=JSON.parse(JSON.stringify(obj1))來實現。但面試官卻要我用循環寫出來,那就只能用遞歸了。可惜當時一下子忘了判斷是否為對象的方法,說出了原理還是被好衣買的沒人性的面試官給pass了,等了半個多小時才來,結果就問了這一道題,沒完全寫出來就pass你,這么牛逼還招什么人啊,自己全搞定不就好了。這樣的方式招人恐怕也是招不到了。好了,不吐槽了,下面開始寫深拷貝的遞歸實現。

<html>
<head>
    <title></title>
</head>
<body>
<script type="text/javascript">
function copy(arr){
    var obj=arr.constructor==Array?[]:{};
  //第二種方法 var obj=arr instanceof Array?[]:{}
  //第三種方法 var obj=Array.isArray(arr)?[]:{}
  for(var item in arr){ if(typeof arr[item]==="object"){ obj[item]=copy(arr[item]); }else{ obj[item]=arr[item]; } } return obj; } var obj={a:1,b:2,c:{d:1,e:[3,4,5]}} var newobj=copy(obj); obj.c.e.push(7); console.log(obj); console.log(newobj); </script> </body> </html>

上面代碼中有測試輸出原對象和深拷貝到newobj上的新對象,如果深拷貝成功的話,obj里面的引用類型改變值,是不會影響到新對象的。以下是在控制台打印的結果:

果然obj和newobj的引用類型互相沒有影響,而不像淺拷貝那樣引用類型共享。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM