1、对于基本数据类型来说,是没有浅拷贝和深拷贝之分的;浅拷贝和深拷贝只针对引用数据类型
2、浅拷贝:假设B复制了A,当修改A时,如果B也跟着变了,说明这是浅拷贝
3、深拷贝:假设B复制了A,当修改A时,如果B没有跟着变,说明这是深拷贝
深拷贝的实现方法:
方法一:
var a = {
name: "tm",
sex: "女"
}
//扩展运算符
//如果只是一层数组或是对象,其元素只是简单类型的元素,那么属于深拷贝(就是一层拷贝,暂时就理解为深拷贝吧!!!!)
var b = {...a}
//修改a的name
a.name = "小小"
console.log(b) //{name: 'tm', sex: '女'}
//打印b,发现b的name并没有改变
方法二:
var test1 = [1,2,3,4,5]
//json的方法
var result1 = JSON.parse(JSON.stringify(test2))
//修改test1的第一个值
test1[0] = 9
console.log(result1) //(5) [1, 2, 3, 4, 5]
// 打印result1,发现result1并没有改变
方法三:
var a = {
name: "tm",
sex: "女"
}
var test2 = {
天空: "blue",
叶子: "green"
}
//extend方法
//true:true为深拷贝,false为浅拷贝
//{}: 复制到一个目标对象中
//test2,a: 被复制的对象们
var result = $.extend(true,{},test2,a)
test2.天空 = "红色"
a.sex = "男"
console.log(result) // {天空: 'blue', 叶子: 'green', name: 'tm', sex: '女'}
打印result,发现result并没有改变
浅拷贝的实现方法:
一般就是 赋值运算符(=)
//浅拷贝
this.sendPrizeList = this.prizeList
this.sendPrizeList.shift()
this.sendPrizeList 和this.prizeList都是数组,是引用数据类型。直接“=”赋值时(如上图)是浅拷贝,相当于将this.sendPrizeList 和this.prizeList的指针指向同一个对象,所以当this.sendPrizeList修改时,this.sendPrizeList 也会改变(此处相当于也执行了this.sendPrizeList .shift()。)
//深拷贝
this.sendPrizeList = JSON.parse(JSON.stringify(this.prizeList));
this.sendPrizeList.shift()
深拷贝相当于将 this.prizeList指向的对象又复制了一份,然后将this.sendPrizeList的指针指向新复制的对象,所以此时改变this.sendPrizeList指向的对象时,this.prizeList指向的对象不受影响(即this.sendPrizeList.shift()不会改变this.prizeLi数组)