美文网首页
Object对象

Object对象

作者: 颖小李 | 来源:发表于2020-07-15 18:35 被阅读0次

    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对象

          本文链接:https://www.haomeiwen.com/subject/dgqjhktx.html