IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> js中浅拷贝与深拷贝的区别及实现方法 -> 正文阅读

[JavaScript知识库]js中浅拷贝与深拷贝的区别及实现方法

浅拷贝:

浅拷贝就是只拷贝一层,更深层次对象级别只拷贝引用(地址)

当拷贝的新对象发生改变时,原对象也会发生相同的改变,也就是说,浅拷贝会影响原来的元素

实现方法:

1、直接赋值法:

var arr = [1,2,3]
        var newarr = arr;
        newarr[1] = 5;
        console.log(arr,newarr);

输出:[1, 5, 3],[1, 5, 3]

var obj = {
            name:'小明',
            age:18,
            car:{
                a:'三轮车'
            }
        }
        var newobj = obj;
        newobj.car = "电动车"
        console.log(obj,newobj);

输出:{name: '小明', age: 18, car: '电动车'},{name: '小明', age: 18, car: '电动车'}

2、Object.assign(参数1,参数2)

此方法类似于将对象合并,如果参数1与参数2key值相同,参数2的值会覆盖参数1

let obj ={
            name:'小明',
            sex:'男',
            car:{
                a:"电动车"
            }
        }
        let obj1 ={
            name:'小红',
            sex:'女',
            age:20
        }
        let newobj = Object.assign(obj,obj1);
        newobj.a = "宝马"
        console.log(newobj);
        console.log(obj);

输出:

{age:?20 ,car:?{a:?'宝马'} ,name:?"小红" ,sex:?"女"}

{age:?20 ,car:?{a:?'宝马'} ,name:?"小红" ,sex:?"女"}

深拷贝:

深拷贝拷贝多层,每一级的数据都会拷贝 深拷贝只拷贝内容,两个对象拥有不同的地址

当拷贝出来的对象发生改变时,原对象内容不会改变,两者互不影响

实现方法:

1、使用JSON

 let obj ={
            name:'小明',
            sex:'男',
            car:{
                a:"电动车"
            }
        }

        let obj1 = JSON.stringify(obj);
        let newobj = JSON.parse(obj1);
        newobj.name="小李";
        newobj.sex="女";
        console.log(obj);
        console.log(newobj);

输出:

{name: '小明', sex: '男', car: {a:?'电动车'}}

{name: '小李', sex: '女', car: {a:?'电动车'}}

2、根据属性进行深拷贝:

var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            },
            color: ['pink', 'red']
        }
        var o = {};
        //封装函数
        function deepCopy(newobj,oldobj){
            for(var k in oldobj){
                //判断我们的属性值属于那种数据类型
                //1、获取属性值  oldobj[k]
                var item = oldobj[k];
                // console.log(item);
                if(item instanceof Array){
                    //判断数据类型是数组
                    newobj[k] = [];
                    deepCopy(newobj[k],item)
                }else if(item instanceof Object){
                    //判断数据类型是对象
                    newobj[k] = {};
                    deepCopy(newobj[k],item)
                }else{
                    //简单数据类型
                    newobj[k] = item;
                }
            }
        }
        deepCopy(o,obj);
console.log(o);

输出:{id: 1, name: 'andy', msg: {?age:?18 }, color: ['pink',?'red']}

3、使用解构赋值和剩余值进行深拷贝

let obj ={
            name:'小明',
            age:18,
            color:['black','yellow'],
            msg:{
                a:'我想你'
            }
        }
        let {...o} = obj
        o.age=20
        console.log(o);
        console.log(obj);

输出:{name: '小明', age: 20, color: ['black','yellow'], msg: {a:?'我想你'}}

{name: '小明', age: 18, color: ['black','yellow'], msg: {a:?'我想你'}}

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:26:06  更:2022-03-24 00:27:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:56:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码