js数据类型

基本类型

  1. Null、String、Bool、Number、Symbol、Undefined
    1. Symbol: 如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。参考

引用类型

  1. Object
    1. Array、Date、RegExp、Function

区别

  1. 基本数据类型的特点:直接存储在栈(stack)中的数据
  2. 引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里。

拷贝

浅拷贝

  1. Object.assign();
  2. 自己实现方法:
1
2
3
4
5
6
7
function shallowClone(source = {}){
var target = {};
for ( let i in source) {
target[i] = source[i];
}
return target;
}
  1. 缺点就对象虽然被复制但是还是会指向相同内存,修改任何一方都影响另一方。

深拷贝

  1. JSON.parse方法
1
2
3
4
5
6
7
const oldObj = {
a: 1,
b: [ 'e', 'f', 'g' ],
c: { h: { i: 2 } }
};

const newObj = JSON.parse(JSON.stringify(oldObj));
  1. 缺点:无法拷贝Function、RegExp;循环引用错误;

  2. 自己实现方法

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
function 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
}