对象深拷贝
本文于373天之前发表,文中内容可能已经过时。
深浅拷贝包含,jq等框架实现方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49function mix(){
var options, name, src, copy, copyIsArray, clone,
target = arguments[0] || {},
i = 1,
length = argument.length,
deep = false;
//判断是否为深拷贝
if(typeof target === 'boolean') {
deep = target;
target = arguments[1] || {};
i++
}
if(typeof target !== 'object' && !isFunction(target)){
target = {};
}
for(; i < length; i++){
if((options = arguments[i]) != null){
for (name in options){
try{
src = target[name];
copy = options[name];
}catch(e){
continue
}
if(target === copy){
continue
}
if(deep && copy && (isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))){
if(copyIsArray){
copyIsArray = false;
clone = src && Array.isArray(src) ? src : [];
}else{
clone = src && isPlainObjrct(arc) ? src : {};
}
target[name] = mix(deep, clone, copy);
}else if(copy !== void 0){
target[name] = copy;
}
}
}
}
return target;
}其中上面用到了判断是否为纯净对象和函数类型的方法,分别实现以下
1 | function isFunction(fn){ |
- Object.assign实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22function toObject(val){
if(val == null){
throw new TypeError('the val type cannot null')
}
return Object(val);
}
function assign(target,source){
var from;
var keys;
var to = ToObject(target);
for(var s = 1; s < arguments.length; s++){
from = arguments[s];
keys = Object.keys(Object(from));
for(var i = 0; i < keys.length; i++){
to[keys[i]] = from[key[i]];
}
}
return to;
}
评论系统未开启,无法评论!