美文网首页
JavaScript - Object Reference

JavaScript - Object Reference

作者: JellyL | 来源:发表于2016-12-16 13:06 被阅读17次

    JavaScript中除了简单数据类型(包括数字、字符串、布尔值、null值和undefined值)外的其他所有值都是对象。
    JavaScript中的对象是无类型的(class-free),也就是对新的属性名和属性值没有限制。

    对象通过引用来传递,永远不会被复制。
    比如:

    //example 1
    let originArray = new Array(0, 1, 2);
    let newArray = originArray; //对象引用
    originArray[0] = 9;
    console.log('originArray', originArray);
    console.log('newArray', newArray);
    

    打印的结果是


    example 1
    //example 2
    let a = {}, b = {}, c = {};
    

    a、b、c每个的引用都是一个不同的空对象。

    //example 3
    let a = b = c = {};
    

    a、b、c都引用的是同一对象。

    对于非对象的数据是可以复制的,不存在引用。

    //example 4
    let originString = 'abc';
    let newString = originString; 
    originString = 'def';
    console.log('originString', originString);
    console.log('newString', newString);
    

    打印结果是


    example 4

    下面再来看一个列子:

    //example 5-1
    let data = {a: 1, b: [0, 1, 2]};
    let dataOne = data;
    function change(dataTwo) {
      dataTwo['c'] = 5; 
      console.log('dataTwo', JSON.stringify(dataTwo));
    }
    change(dataOne);
    console.log('dataOne', JSON.stringify(data));
    console.log('data', JSON.stringify(data));
    

    这样的情况下,打印的结果是


    example 5-1

    但是对象引用赋值后,如果将对象置空,相互不受影响。

    //example 5-2
    let data = {a: 1, b: [0, 1, 2]};
    let dataOne = data;
    function change(dataTwo) {
      dataTwo['r'] = 5; 
      dataTwo = null;
      console.log('dataTwo', JSON.stringify(dataTwo));
    }
    change(dataOne);
    console.log('dataOne', JSON.stringify(data));
    console.log('data', JSON.stringify(data));
    
    example 5-2

    最近在项目中遇到一个这样的问题,所以才引起了我对Refrence的反思。

    const defaultPromo= {
          code: '',
          isValid: null
    };
    const defaultDiscounts = {
        discount1: defaultPromo,
        discount2: defaultPromo
    };
    
    const promoCodes = {
        discount1: {
            code: "inValid",
            isValid: false
        },
        discount2: {
            code: "79315",
            isValid: true
        }
    };
    const result = _.merge(defaultDiscounts, promoCodes);
    

    result 会是什么呢?是这样吗?

    {
        discount1: {
            code: "inValid",
            isValid: false
        },
        discount2: {
            code: "79315",
            isValid: true
        }
    }
    

    ☝🏻☝🏻☝🏻其实是这样的:

    {
        discount1: {
            code: "79315",
            isValid: true
        },
        discount2: {
            code: "79315",
            isValid: true
        }
    }
    

    在这种情况下,就需要使用clone或者使用...

    const defaultPromo= {
          code: '',
          isValid: null
    };
    const defaultDiscounts = {
        discount1: {... defaultPromo},
        discount2: {...defaultPromo}
    };
    
    const promoCodes = {
        discount1: {
            code: "inValid",
            isValid: false
        },
        discount2: {
            code: "79315",
            isValid: true
        }
    };
    const result = _.merge(defaultDiscounts, promoCodes);
    

    相关文章

      网友评论

          本文标题:JavaScript - Object Reference

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