基本类型和引用类型
基本类型数据存放在栈内存中,如number,string。复制时直接赋值即可
引用类型数据存放在堆内存中,如object,数组。赋值时是赋予地址值。(只是浅拷贝)
浅拷贝和深拷贝
//浅拷贝
function simpleClone(initobj){
var obj = {};
for(var i in initobj){
obj[i] = initobj[i];
}
return obj;
}
或者:
Object.assign(target,sources);复制给target;
//深拷贝
var obj = JSON.parse(JSON.stringify(initobj));
JSON.stringify把对象转为字符串,JSON.parse把字符串转为新的对象。
或者
function deepClone(obj){
var objClone = Array.isArray(obj)?[]:{};
if(obj&&typeof obj==='object'){
for(var key in tobj){
if(obj.hasOwnProperty(key)){
if(obj[i]&&typeof obj[key]==="object"){
objClone[key] = deepClone(obj[key]);
}
else {
objClone[key] = obj[key];
}
}
}
}
return onjClone;
}
先实现getType函数对元素进行类型判断(另一种深拷贝)
Object.prototype.toString方法用来判断元素的类型;
Object.prototype.toString.call([1,2]); //"[object Array]" 可以给出类型。
function getType(obj){
//tostring会返回对应不同的标签的构造函数
var toString = Object.prototype.toString;
var map = {
'[object Boolean]' : 'boolean',
'[object Number]' : 'number',
'[object String]' : 'string',
'[object Function]' : 'function',
'[object Array]' : 'array',
'[object Date]' : 'date',
'[object RegExp]' : 'regExp',
'[object Undefined]': 'undefined',
'[object Null]' : 'null',
'[object Object]' : 'object'
};
if(obj instanceof Element) {
return 'element';
}
return map[toString.call(obj)];
}
然后deepclone
function deepClone(data){
var type = getType(data);
var obj;
if(type === 'array'){
obj = [];
} else if(type === 'object'){
obj = {};
} else {
//不再具有下一层次
return data;
}
if(type === 'array'){
for(var i = 0, len = data.length; i < len; i++){
obj.push(deepClone(data[i]));
}
} else if(type === 'object'){
for(var key in data){
obj[key] = deepClone(data[key]);
}
}
return obj;
}
其他类型的深拷贝
JSONP方式
function (obj) {
let tmp = JSON.stringify(obj);
let result = JSON.parse(tmp);
return result;
}