Object对象

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

你可能感兴趣的:(Object对象)