在JS中對象一般都是傳地址,后續修改也會影響原始數據。例如這樣。
var a={ b:"b" }; var c=a; c.b="c"; console.log(a); console.log(c);
會發現a.b也變成了"c"。
以下是網上一位高手寫的JS實現值復制,獨立復制一個對象,避免雙向修改。
//值復制 function clone(obj) { //判斷是對象,就進行循環復制 if (typeof obj === 'object' && typeof obj !== 'null') { // 區分是數組還是對象,創建空的數組或對象 var o = Object.prototype.toString.call(obj).slice(8, -1) === "Array" ? [] : {}; for (var k in obj) { // 如果屬性對應的值為對象,則遞歸復制 if(typeof obj[k] === 'object' && typeof obj[k] !== 'null'){ o[k] = clone(obj[k]) }else{ o[k] = obj[k]; } } }else{ //不為對象,直接把值返回 return obj; } return o; }
上述代碼有一個bug,就是針對null的處理,null在js中的類型是object,上述代碼會將null復制成{}。根本的問題在於高手在條件“typeof obj === 'object' && typeof obj !== 'null'”的時候做了錯誤的判斷,試想類型是object了肯定類型就不是null了吧。以下是修正后的方法:
//值復制 function clone(obj) { //判斷是對象,就進行循環復制 if (typeof obj === 'object' && obj!=null) { // 區分是數組還是對象,創建空的數組或對象 var o = Object.prototype.toString.call(obj).slice(8, -1) === "Array" ? [] : {}; for (var k in obj) { // 如果屬性對應的值為對象,則遞歸復制 if(typeof obj[k] === 'object' && obj[k]!=null){ o[k] = clone(obj[k]) }else{ o[k] = obj[k]; } } }else{ //不為對象,直接把值返回 return obj; } return o; }
更多個人技術文章請訪問:http://88gis.cn/