学习笔记

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
const syb = Symbol('str')
const person = {
syb,
name: 'name',
age: 18,
un: undefined,
nu: null,
is: true,
date: new Date(),
arr: [1, 2, 3, 4],
fu: function () {
console.log('123')
},
re: /\d/gi,
o: {
a: 1,
b: '3',
c: true
}
}
console.log('person', person)
const test = JSON.parse(JSON.stringify(person))
console.log('test', test)

function copyRegExp(regExp) {
let attrs = '';
if (regExp.global) attrs += 'g';
if (regExp.ignoreCase) attrs += 'i';
if (regExp.multiline) attrs += 'm';
let newRegExp = new RegExp(regExp, attrs);
newRegExp.lastIndex = regExp.lastIndex;
return newRegExp;
}

function getDataType(data) {
return Object.prototype.toString.call(data).slice(8, -1)
}

// 数据深拷贝函数 特殊不能识别的数据类型需要自行添加判断及返回 例如正则对象
function deepCopy(obj) {
// 基础类型值直接返回原数据 string,number,boolean,null,undefined
if (obj === null || typeof obj !== 'object') return obj
// 初始化返回数据
switch (getDataType(obj)) {
// 时间对象 重新生成
case 'Date':
console.log()
return new Date(obj.getTime())
// 函数对象 直接返回
case 'Function':
return obj
// 正则对象 重新解析
case 'RegExp':
// 直接返回会具有相同的指针,没有做到真正意义上的深拷贝
return copyRegExp(obj)
// 默认按object和array来解析
default:
let result = Array.isArray(obj) ? [] : {}
for (const key in obj) {
result[key] = deepCopy(obj[key])
}
return result
}
}
const deep = deepCopy(person)
console.log('deep', deep)

代码示例
参考链接1
参考链接2