js数据与类型与数据拷贝
数据类型
s的数据类型有种划分方式为 原始数据类型和 引用数据类型。
原始数据类型 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。栈区包括了 变量的标识符和变量的值。
引用数据类型 存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。放在栈空间中的值是该对象存储在堆中的地址。
基本类型
Undefined、Null、Boolean、Number、String、Symbol
引用类型
Object、Array、Date、RegExp、Function
数据拷贝
基本类型是按值传递,像是这样:在修改a时并不会改到b
var a = 25;
var b = a;
b = 18;
console.log(a);//25
console.log(b);//18
引用类型按引用传值
var obj1 = { a: 10, b: 20, c: 30 };
var obj2 = obj1;
obj2.b = 100;
console.log(obj1);
// { a: 10, b: 100, c: 30 } <-- b 被改到了
console.log(obj2);
// { a: 10, b: 100, c: 30 }
更改obj2值的同时obj1的值也会发生变化,因为他们指向同一个对象,这就是浅拷贝
浅拷贝实现
直接赋值
let a=1
let b=a//1
Object.assign()
Object.assign是ES6的新函数。Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign() 进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。
var obj = { a: {a: "hello", b: 21} };
var obj1 = Object.assign({}, obj);
obj1.a.a = "changed";
console.log(obj.a.a); // "changed"
深拷贝实现
序列化反序列化
var syb = Symbol('obj');
var person = {
name :'tino',
say: function(){
console.log('hi');
},
ok: syb,
un: undefined
}
var copy = JSON.parse(JSON.stringify(person))
方法简单有效,当值为undefined、function、symbol 会在转换过程中被忽略,所以对象值有这三种的话用这种方法会导致属性丢失。
递归
function deepCopy(obj) {
var result = Array.isArray(obj) ? [] : {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object') {
result[key] = deepCopy(obj[key]); //递归复制
} else {
result[key] = obj[key];
}
}
}
return result;
}
展开运算符…
只适用于单层对象
let a={aa:1,bb:2,cc:3}
let b={...a}