对象的深浅拷贝

js是一门弱类型语言,ECMAScript指出数据类型主要:基本类型值和引用类型值。基本类型值指的是简单的数据段;引用类型值指由多个值构成的对象。当我们把变量赋值给一个变量时,解析器首先要做的就是确认这个值是基本类型值还是引用类型值。

在看具体分类之前需要明确:js只能操控栈,不能操控堆(是否是这么说?)

基本数据类型有以下几种:

number,string,boolean,undefined,null 这五种

基本数据类型可以直接操作保存在变量中的实际值,当变量本身发生变化时不对拷贝值造成影响。也就是直接在栈中操作。

如:

var a = 10;
var b = a; //b是a的拷贝
a = 20; //变量a发生变化
console.log(b);  //10

引用数据类型:——修改原始引用会对其他应用产生影响

array,function,object。 这几种引用数据类型,实际上存在于堆中,栈中保留的只是堆中的引用。通过栈中的引用很容易找到堆中保留的原始数据。

如:

var obj = {name:"wuya"};
var obj2 = obj;
obj.name = "";
console.log(obj2.name);  //""

直接赋值的方式就是所谓的浅拷贝。

如果我们想原始引用不影响拷贝,即所谓的深拷贝,就需要处理下。

实现一:

复制代码
function clone(obj){
    if(typeof obj != obj || obj == null){  //注意:typeof null == 'object'
        return obj;      
    }    
    var temp = obj.constructor();   
    for(var key in obj){
        temp[key] = clone(obj[key]);  
    }
   return temp;
}
var obj = {name:"wuya"};
var obj2 = clone(obj);
obj.name = '';
console.log(obj2.name); //wuya
复制代码

实现二:

复制代码
var bob = {
    name: "Bob",
    age: 32
};
 
var bill = (JSON.parse(JSON.stringify(bob)));
bill.name = "Bill";
 
console.log(bob);
console.log(bill);
复制代码

如果浏览器不支持JSON.stringify,引入json.org库就行

参考:

1.http://heyjavascript.com/4-creative-ways-to-clone-objects/

2.http://www.cnblogs.com/pigtail/archive/2012/06/29/2569601.html

posted @   城池  阅读(778)  评论(2编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示