zoukankan      html  css  js  c++  java
  • 深浅拷贝

    在js中,变量所存的值分为了原始类型和引用类型,其中Number,String是原始值,其他是引用值。

    原始类型的值在传递过程中是按值传递,而引用类型传递的则是指针,即传递的仅仅只是引用关系,并非真正的值,若内存中的真实值被修改,则所有引用此值的变量都会被更新。

    在复制对象的过程中,如果仅复制了引用指针,则称为浅复制;复制了真实值,则称为深复制。

    浅拷贝:

    浅拷贝一般都是直接将对象赋值给新变量就完事儿了,对于原始值来说,副本和正本从此没啥关系了。而对于引用类型,像数组和对象之类的值,副本和正本拿到的是同一个数据,数据更新后,正本和副本都会更新。

    var obj = {
            name :'zhouxiaohouer',
            age:24,
            assets:{
                cash:1234,
                stock:22222
            },
            say:function() {
                console.log(this.name)
            }
        }
        var objb = obj
        obj.name = 'fixed'
        console.log(obj.name)//fixed
        console.log(objb.name)//fixed

    深拷贝:
    深拷贝本质上是递归实现浅拷贝,深拷贝之后,副本和正本从此也没啥关系了。

        var obj = {
            name :'zhouxiaohouer',
            age:24,
            assets:{
                cash:1234,
                stock:22222
            },
            say:function() {
                console.log(this.name)
            }
        }
        function deepCopy(o) {
            var backup = {}
            for(var key in o){
                backup[key] = typeof o[key] === 'object'?deepCopy(o[key]):o[key]
            }
            return backup
        }
        var objb = deepCopy(obj)
        obj.name = 'fixed'
        console.log(obj.name)//fixed
        console.log(objb.name)//zhouxiaohouer

    数组的深拷贝则可以借助Array.slice(start[,end])来实现,对象的Object.create方式见面向对象编程系列。

  • 相关阅读:
    jqGrid获取选中行id集合
    jqGrid通过行id获取行对象
    【链接】Eclipse中快速打开文件所在的文件夹位置
    springboot下html的js中使用shiro标签功能
    从一次渗透谈到linux如何反弹shell
    安全建设的几个阶段
    BluePrint和ORM
    flask框架实战项目架构
    配置Python实战开发环境
    python 进行抓包嗅探
  • 原文地址:https://www.cnblogs.com/zhouxiaohouer/p/8037729.html
Copyright © 2011-2022 走看看