深拷贝和浅拷贝的快速解剖

Posted 赵不悔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深拷贝和浅拷贝的快速解剖相关的知识,希望对你有一定的参考价值。

类型汇总

number:1
string:"abccnm"
boolean:true
object:{ } [ ] null
undefined:undefined
function:(){}
symbol()symbol


值和引用的区别

他们的区别在于箭头指向:
值类型就是把我的绝世武功给你,我是不变的!而你可以学我的!但是你学了蛤蟆功,跟我没什么关系
引用类型取决于变量地址,确切的说你偷走我的钱包!花完之后又给了我!最后值都是0.1

值类型
number string boolean
var a=1
var b = a
//此时a和b相同等于1

b=2
//此时b等于2,a还是1

引用类型
object { } [ ]
var a={ money:500 }
var b = a
//此时a和b都是\'我\'

b.money = 1
//此时b等于1,a拿到的也是1

浅拷贝:想让引用类型跟值一样效果
item就是里面的信息money
run[item]就是 run里面所有名称money或name等
copys(a)就是拷贝出来的 run,祸害我就行了!a不会变
var a = {
    money:500
}

function copys(x)
{
    var run = {}
    for(let item in x)
    {
         run[item] = x[item]
    }
    return run
}

var b = copys(a)
b.money = 1

console.log(`此时a:${a.money}, 而b则是${b.money}`)

深拷贝: 第一层的a{ name:"xx" }本体没变,但是第二层的a{ mygirl:[\'苍xx\',\'饭xx\',\'波多xxx\'] } 却都被改变了
第一招:lodash _.clone("浅")_.cloneDeep("深")
var a = { name:"大帅哥", mygirl:[\'苍xx\',\'饭xx\',\'波多xxx\'] }
var b = _.cloneDeep(a)
var b = _.clone(a)
第二招:object.assign({}, a)
{}空的或者新增 sb:123 一层浅拷贝
var a = {
    name:"苍井空"
}

var b = Object.assign({}, a)
b.name = "饭岛爱"
console.log(`此时a:${a.name}, 而b则是${b.name}`)
第三招:JSON.parse( JSON.stringify(a) )
stringify把你的对象变成字符串,然后再变成对象。重复操作
你看看人家A,你再看看你b
最后一点,那就是这里的a={ fn:function(){ return xxx } }
var a = {
    girl:[\'苍xx\',\'饭xx\',\'波多xxx\']
}

var b = JSON.parse( JSON.stringify(a) )
b.girl[0] = "茅房厕子"
console.log(`此时a:${a.girl}, 而b则是${b.girl}`)

以上是关于深拷贝和浅拷贝的快速解剖的主要内容,如果未能解决你的问题,请参考以下文章

代码学习PYTHON 深拷贝和浅拷贝

Java深拷贝和浅拷贝

学习:类和对象——深拷贝和浅拷贝

ES6的解构赋值与深拷贝和浅拷贝

ES6的解构赋值与深拷贝和浅拷贝

Python高级详解 深拷贝和浅拷贝