JS的数据类型分为基本数据类型、引用数据类型(复合数据类型)
基本类型:按值传递,传入函数的是数据的副本,不改变原值
它是简单的值,直接存放在内存栈中
引用类型:按引用传递,传入函数的是该数据的引用
它是一个数组或者对象,存放在内存栈中的是指向该对象的指针,完整的对象存放在内存堆中
浅拷贝:
所要复制的对象的属性不是引用,则通过遍历拷贝出来的新的对象,与源对象有相同的引用
function shallowClone (source){
if(!source || typeof source != 'object'){
throw new Error ('error');
}
var targetObj = source.constructor === Array ? [] : {};
//遍历拷贝源对象的属性
for(var keys in source) {
if(source.hasOwnProperty(keys)){
targetObj[keys] = source[keys];
}
}
return targetObj;
}
JS内部的浅拷贝:Object.assign()
、Array.prototype.slice()
、Array.prototype.concat()
库中的浅拷贝:$.extend({},sourceObj)
深拷贝:
复制出来的是一个新的对象,拥有自己的属性和方法
将js对象序列化成JSON字符串,再反序列化回到js对象,也可以实现深拷贝
newObj = JSON.parse(JSON.stringify(obj));
这个方法又有很多的限制:
1.JSON是一种表示结构化数据的格式,只支持简单值、对象和数组三种类型,不支持变量、函数或对象实例
2.会抛弃对象的constructor,所有的构造函数会指向Object
3.对象有循环引用,会报错