第一(简单粗暴):面试
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产生影响;对象