==============
变量存储类型分两类
①基本类型:直接存储在栈中的数据。(字符串、布尔值、未定义、数字、null)
②引用类型:将该对象引用地址存储在栈中,然后对象里面的数据存放在堆中。(数组、对象、函数)
这里解释一下为什么null是基本类型:有人说他用type of打印出来不是oject吗?
null只是一个空指针对象,没有数据。根据引用类型特点可以看一下是否符合。
=================
深拷贝和浅拷贝还有赋值的区别
浅拷贝:也就是拷贝A对象里面的数据,但是不拷贝A对象里面的子对象
深拷贝:会克隆出一个对象,数据相同,但是引用地址不同(就是拷贝A对象里面的数据,而且拷贝它里面的子对象)
赋值:获得该对象的引用地址
浅拷贝:
!!!! 只有第一层数据不会随着变 但是如果数组里面嵌套对象或者数组 就会随着变
扩展运算符 和 array.assign()
var x=[1,2,{'a':1}];
y=x;
z=[...x];
y[0]=2;
y[2].b=2;
z[2].a=2;
console.log(x,y,z) // x,y: [2,2,{a:2,b:2}] z: [1,2,{a:2,b:2}]
还包括slice()
var arr=[1,[10,10,10],2,3];
var ar=arr.slice(0,2);
arr[1][1]=1
arr[0]=2
console.log(arr); // [ 2, [ 10, 1, 10 ], 2, 3 ]
console.log(ar); // [ 1, [ 10, 1, 10 ] ]
和 concat()
var arr2=[[1]]
var ar2=[[1]];
var a=arr2.concat(ar2);
console.log(a);
console.log(arr2);
console.log(ar2);
arr2[0][0]=100;
ar2[0][0]=200;
console.log(a); // [ [ 100 ], [ 200 ] ]
console.log(arr2); // [ [ 100 ] ]
console.log(ar2); // [ [ 200 ] ]
a[1][0]=300;
console.log(ar2); // [ [ 300 ] ]
深拷贝方法:
- str = JSON.stringify(obj) 先将对象转换为字符串
JSON.parse(str) 然后再将字符串转为对象
2 递归拷贝:
浅拷贝 + 递归,浅拷贝时判断属性值是否是对象,如果是对象就进行递归操作,两个一结合就实现了深拷贝
var deepCopy = function(obj) {
if (typeof obj !== 'object') return;
var newObj = obj instanceofArray ? [] : {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
}
}
return newObj;
}