js数据类型
基本类型
- Null、String、Bool、Number、Symbol、Undefined
- Symbol: 如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。参考
引用类型
- Object
- Array、Date、RegExp、Function
区别
- 基本数据类型的特点:直接存储在栈(stack)中的数据
- 引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里。
拷贝
浅拷贝
- Object.assign();
自己实现方法:
1
2
3
4
5
6
7function shallowClone(source = {}){
var target = {};
for ( let i in source) {
target[i] = source[i];
}
return target;
}缺点就对象虽然被复制但是还是会指向相同内存,修改任何一方都影响另一方。
深拷贝
JSON.parse方法
1
2
3
4
5
6
7const oldObj = {
a: 1,
b: [ 'e', 'f', 'g' ],
c: { h: { i: 2 } }
};
const newObj = JSON.parse(JSON.stringify(oldObj));- 缺点:无法拷贝Function、RegExp;循环引用错误;
- 自己实现方法
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
27function checkType(obj){
retrun Object.prototype.toString.call(obj).slice(8, -1); //[object,String]
}
function deepClone(target) {
let result, targetType = checkedType(target)
if (targetType === 'object') {
result = {}
} else if (targetType === 'Array') {
result = []
} else {
return target
}
for (let i in target) {
let value = target[i]
if (checkedType(value) ==='Object' || checkedType(value) ==='Array') {
result[i] = deepClone(value)
} else {
result[i] = value;
}
}
return result
}