1.Object.assign(target, ...source),返回目标对象。
针对深拷贝,需要使用其他办法,因为 Object.assign()拷贝的是(可枚举)属性值。
假如源值是一个对象的引用,它仅仅会复制其引用值。
实现对象的深拷贝的方法:
let obj1 = { a: 0 , b: { c: 0}};
let obj3 = JSON.parse(JSON.stringify(obj1));
obj1.a = 4;
obj1.b.c = 4;
log(JSON.stringify(obj3));
// { a: 0, b: { c: 0}}
2.将Object 转换成 Map
为什么要转成Map类型呢?
var obj = { foo: "bar", baz: 42 };
var map = new Map(Object.entries(obj));
console.log(map); // Map { foo: "bar", baz: 42 }
Object.fromEntries(iterable) 方法把键值对列表转换为一个对象,可以将Map转成Object,为什么要转?
3.Object.is(val1,val2)
在不考虑 +0 -0 和NaN的相等时,可以等同于 ===
Object.is(0, -0); // false
Object.is(0, +0); // true
Object.is(-0, -0); // true
Object.is(NaN, 0/0); // true
3.js的浅拷贝、深拷贝、及对象的赋值操作
基础类型的值,存在栈中;
引用类型,在栈中存放地址,在堆中存放具体的对象
(1)对象和数组的赋值操作
只复制了引用
(2)浅拷贝
只拷贝了一层,如果有嵌套的对象值,仍然会相互影响
(3)深拷贝
绝不会相互影响
4.浅拷贝的实现
Object.assign(target, source)
5.深拷贝的实现
(1)JSON.stringify()以及JSON.parse()
不可以拷贝 undefined , function, RegExp 等等类型
(2)递归拷贝
// 定义一个深拷贝函数 接收目标target参数
function deepClone(target) {
// 定义一个变量
let result;
// 如果当前需要深拷贝的是一个对象的话
if (typeof target === 'object') {
// 如果是一个数组的话
if (Array.isArray(target)) {
result = []; // 将result赋值为一个数组,并且执行遍历
for (let i in target) {
// 递归克隆数组中的每一项
result.push(deepClone(target[i]))
}
// 判断如果当前的值是null的话;直接赋值为null
} else if(target===null) {
result = null;
// 判断如果当前的值是一个RegExp对象的话,直接赋值
} else if(target.constructor===RegExp){
result = target;
}else {
// 否则是普通对象,直接for in循环,递归赋值对象的所有值
result = {};
for (let i in target) {
result[i] = deepClone(target[i]);
}
}
// 如果不是对象的话,就是基本数据类型,那么直接赋值
} else {
result = target;
}
// 返回最终结果
return result;
}
网友评论