js 引用类型与深拷贝

  • 基本数据类型:
    undefined,null,string,boolean,number
    在console中可以通过typeof看到,如:
    在这里插入图片描述

  • 引用类型:
    Object,Array,Date,RegExp,Function,
    基本包装类型(Boolean,Number,String),内置对象(Global,Math)。
    引用类型可以在控制台直接敲出对象名,如:
    在这里插入图片描述


  • 深拷贝与浅拷贝
    一般的赋值,= 即浅拷贝。
    eg:
var b=undefined,a=1;
b = a;
console.log('a='+a+';b='+b);

a = 2;
console.log('a='+a+';b='+b);

运行结果:
在这里插入图片描述

compare:

var a=[1,2,3];
var b = a;
console.log('a='+a+';b='+b);

b.push(12);
console.log('a='+a+';b='+b);

在这里插入图片描述
原因:
a是引用各类型,将a赋值给b时,其实只是将a的引用类型的内存地址赋值给b,此时a和b实际是存的是指向同一个内存块的地址。所以,在a或b里的值被修改后,另一个也会被修改。从而,就出现了深拷贝方式,以解决这类问题。而基础数据类型,变量a、b存的就是值本身。

浅拷贝:一般用在基础数据类型的赋值,或者引用类型赋值时只是为了简化变量。
深拷贝:一般用在引用数据类型赋值后,希望两个变量的内容相互不干扰时。


  • 深拷贝的方法
  1. jQuery 的extend方法
var   a   =  {};
$.extend(a,b); //将b拷贝给a

注:此方法只能在单层使用,多层嵌套的对象,则只对外层有用。
如:

var a = [{'aa':'a'},{'bb':'b'}];
var b = [];
$.extend(b,a);
//修改外层b
b.push({'dd':'d'});
//修改对象内的数据
b[0].cc = 'c';

运行结果:
在这里插入图片描述

angularjs方法:

var newData = angular.copy(data);

2. JSON转换方法
原理:将对象转换为基础类型的string,赋值后再转换为对象,以此规避对象赋值只是赋值引用地址的问题。

var c = JSON.stringify(a);
var b = JSON.parse(c); //将a拷贝给b

附:

var a= {a:1};
var b = a;
b = {b:2};

这种情况下,b便与a脱离,没有指向同一地址,最后一句即相当于将b重新赋值。
运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值