第一(簡單粗暴):面試
let arr = [1, {a: 2}]; let copyArr = JSON.parse( JSON.stringify(arr) ); console.log(copyArr ) // [1, {a: 2}] arr[1].a = 3; console.log(copyArr ) // [1, {a: 2}] copyArr[1].a = 5; console.log(arr) // [1, {a: 2}]
能夠看出來,改變原數組arr,並無對新數組copyArr產生影響;改變新數組copyArr也沒有對原數組arr產生影響;數組
第二(面試官大多數會問這種方法):code
let arr = [1, {a: 2}]; function deepCopy(arr) { let copyArr = (arr.constructor === Array) ? [] : {}; // 判斷是數組仍是對象 for(let i in arr) { if(typeof arr[i] === 'object') { // 判斷是值類型仍是引用類型 copyArr[i] = deepCopy(arr[i]); // 引用類型的話進行遞歸操做 } else { copyArr[i] = arr[i]; // 值類型直接賦值 } } return copyArr; } let copyArr = deepCopy(arr); console.log(copyArr ) // [1, {a: 2}] arr[1].a = 3; console.log(copyArr ) // [1, {a: 2}] copyArr[1].a = 5; console.log(arr) // [1, {a: 2}]
一樣:改變原數組arr,並無對新數組copyArr產生影響;改變新數組copyArr也沒有對原數組arr產生影響;對象