先说一个规则: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