javascript对象深拷贝

先说一个规则:javascript所有原始类型变量的传递都是值传递,所有非原始类型变量的传递都是引用传递,只是内存地址的传递。

看一个例子吧:

var name = "john";
var person = {
name: name,//原始类型变量传递,是值传递,变量name的改变不会影响person
sex:'male',
age:16
};
name = 'jack';
console.log(person);//Object {name: "john", sex: "male", age: 16}
var xiaoMing = person;//非原始类型变量的传递,引用传递,所以引用变量改变会同步给新变量
xiaoMing.name = 'xiaoming';
console.log(person);//Object {name: "xiaoming", sex: "male", age: 16}
function person (name,age) {
this.name = name;
this.age = age;
this.sex = 'female';
};
var rose = new person("rose",26);
var jack = new person("jack",26);
jack.sex = 'male';//实例的改变不会影响到另一个实例,这一点是与backbonejs不同的,学习backbone的时候要注意
console.log(jack.sex);//male
console.log(rose.sex);//female

在写js的时候,要注意变量赋值,对于引用赋值,要根据情况判断是否需要改变源变量。

由于此特性的存在,如果需要根据源变量产生一个完全一样的变量,但是两者的变化不是同步的,就需要用到对象的深度拷贝了。

什么是对象的深拷贝呢?

对象的深拷贝是指复制源对象新建一个对象,复制源对象的所有属性和方法。此新对象与对象一样,拥有自己的完整的内存空间,改变源对象或者新对象,相互都不会有影响。深拷贝与浅拷贝区别从哪儿看出来呢?对任何嵌套对象或者数组进行拷贝最容易看出来区别。

jQuery实现深度赋值的方法是$.extend().具体使用见我的博客关于拷贝对象的一些常用API

此条目发表在NodeJs分类目录,贴了标签。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注