-
基本数据类型(值类型):
-
Number、String、Boolean、Null、Undefined、Symbol、BigInt -
直接存储在栈内存中
-
不可以动态地添加属性:
let name = "bob" name.age = 22 // Cannot create property 'age' on string 'bob' console.log(name.age) // undefined -
复制时拷贝的是值,所以复制前后的两个变量彼此独立:
let n1 = 5; let n2 = n1; n1 = 6; console.log(n2); // 5
-
-
引用数据类型:
-
Object(包括数组、函数、日期等) -
值存储在堆内存中,栈内存存储指向堆内存的引用地址
-
可以动态地添加属性
-
由于实际操作的是栈上的指针变量,所以复制指针拷贝了地址只是浅拷贝:
let o1 = { "name": "bob" } let o2 = o1; o2.name = "amy"; console.log(o1); // amy console.log(o2); // amy可以通过深拷贝解决:
let o1 = { "name": "bob" } let o2 = deepCopy(o1); o2.name = "amy"; console.log(o1); // bob console.log(o2); // amy// DFS地递归深拷贝 function deepCopy(obj, hash = new WeakMap()) {// bound// 如果不是有效的对象类型,则浅拷贝就是深拷贝if (obj === null || typeof (obj) !== 'object') {return obj;}// body// 求hash来处理循环引用if (hash.has(obj)) {return hash.get(obj);}const copy = Array.isArray(obj) ? [] : {};hash.set(obj, copy);for (const key in obj) {if (obj.hasOwnProperty(key)) {copy[key] = deepCopy(obj[key], hash);}}return copy; }
-