javaScript对象在赋值时,常常直接使用”=”,觉得可以直接把一个一个对象赋值给另一个对象;
javaScript中的数据类型分为两类,原始类型和对象类型;
1.原始类型:包括数值,字符串、布尔值、null、undefined;
2.对象类型:对象即属性的集合(function、Array);
先了解数据类型在计算机中的存储;
1.原始类型:存储的是对象的原始数据;
2.对象类型:对象的原型也是引用类型,对象类型的值单独存放。对象原型的方法和属性放在内存中,通过原型链的方式来指向这个地址;所以对象类型存储的是对象的引用地址;
一、原始类型:
字符串:
var a = "a";
var b = a;
b = "b";
console.log("a:"+a);// "a"
console.log("b:"+b);// "b"
布尔类型
var a = true;
var b = a;
b = false;
console.log("a:"+a);// true
console.log("b:"+b);// false
数值
var a = 1;
var b = a;
b = 2;
console.log("a:"+a);// 1
console.log("b:"+b);// 2
重以上的离职可以看出,原始对象的复制,通过”=”的方式仍然能够获得正确的值;
二、对象类型
看代码:
var person = {
name:"z",
age:24,
child:{
name:"z-1",
age:2
}
}
var person_o = person;
person_o.child.age = 200;
console.log("person:"+person.child.age);// 200
console.log("person_o:"+person_o.child.age);// 200
对象类型在复制的时候,只是将对象的引用复制了,将person对象的引用地址值赋值给了person_o
所以在perison_o改变对象属性值的时候,person的引用也发生了改变,它们在内存中获取的都是同
一个对象;
解决方案;
JQuery中有extend()方法合并多个对象;
使用:var newSrc=$.extend({},src1,src2,src3…);很轻松的搞定;
javaScript中没有明确类的概念,我们要针对每个对象类型,写个方法,复制对象中的每个属性及方法;
/**
* 对象复制(克隆)方法,改变对原对象的引用,生成新对象
* 复制时包括对象中的属性,方法;
* 其中dataType()方法请参照方法库:[javascript常用方法整理;(不断更新)](http://blog.csdn.net/j_y_x_8/article/details/52045716)
*
* @obj:数据
**/
function clone(obj){
var result = {},objClass=dataType(obj);
if (objClass==="Object") {
result = {};
}else if (objClass==="Array"){
result = [];
}else{
return obj;
}
// 遍历obj对象的每一个属性
for ( var key in obj ){
var = obj[key];
if (dataType(val)==="Object"){
result[key] = arguments.callee(val);
}else if(dataType(val)==="Array"){
result[key] = arguments.callee(val);
}else{
result[key] = obj[key];
}
}
return result;
};