JS的浅拷贝和深拷贝

    技术2025-04-15  10

    二者的区别

    浅拷贝只是将被克隆对象的引用值赋值于新对象,如果改动引用值,二者都会受影响而深拷贝是将值拷贝过来,改动不会影响。

    浅拷贝方法

    普通for循环 var a = { name:'zs', hobby: { sport:{ swim:true } } } var obj = {} for (let key in a) { if (a.hasOwnProperty(key)) { obj[key] = a[key] } } console.log(obj) 只要改动obj中hobby的值,那么a对象中的也会改变,因为他们指向同一个指针 ES6展开运算符 var a = { name:'zs', hobby: { sport:{ swim:true } } } var obj = {...a} Object.assign方法 var a = { name:'zs', hobby: { sport:{ swim:true } } } var obj = Object.assign(a)

    深拷贝方法

    Json.parse(JSON.stringify(obj)) 这是最直接的方法,弊端是遇到正则,函数,date对象等类型的值会转换错误 适用于一般对象数组类型的拷贝

    递归法

    function deepClone(obj,newObj) { let target = newObj || {} if(!obj || typeof obj !== "object"){ return obj } for (let key in obj) { if (obj[key] instanceof Object) { console.log(key); target[key] = deepClone(obj[key], {}) } else{ target[key] = obj[key] } } return target } 递归结束条件如果传递对象为空或者类型不是对象类型for循环遍历对象 ,如果属性值依然是引用类型,再次调用函数,否则直接赋值于新对象
    Processed: 0.010, SQL: 9