-
基本数据类型:
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存的就是值本身。
浅拷贝:一般用在基础数据类型的赋值,或者引用类型赋值时只是为了简化变量。
深拷贝:一般用在引用数据类型赋值后,希望两个变量的内容相互不干扰时。
- 深拷贝的方法:
- 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重新赋值。
运行结果: