Search code examples
javascriptcopysemantics

Javascript copy semantics


the following is the normal javascript semantics:

js> a={'a':{'red':12,'green':23,'blue':34}}
({a:{red:12, green:23, blue:34}})
js> b=a['a']                                                                    
({red:12, green:23, blue:34})
js>b={red:122, green:232, blue:142}                                                                        
({red:122, green:232, blue:142})
js> a
({a:{red:12, green:23, blue:34})
js>

the following is the semantics I would like to have:

js> a={'a':{'red':12,'green':23,'blue':34}}
({a:{red:12, green:23, blue:34}})
js> b=a['a']                                                                    
({red:12, green:23, blue:34})
js>b={red:122, green:232, blue:142}                                                                        
({red:122, green:232, blue:142})
js> a
({red:122, green:232, blue:142})
js>

is there any simple inner trick to make javascript to behave my way?


Solution

  • Javascript doesn't have "pointer to a reference" types. However, you can create a "property of an object" type (object, property name; cannot point to a local variable).

    a={'a':{'red':12,'green':23,'blue':34}}
    //({a:{red:12, green:23, blue:34}})
    b={obj:a, key:"a"}
    b.obj[b.key]                                                             
    //({red:12, green:23, blue:34})
    b.obj[b.key]={red:122, green:232, blue:142}                                                                        
    //({red:122, green:232, blue:142})
    a
    //({a:{red:122, green:232, blue:142}})
    

    alternatively, you could overwrite the object b refers to:

    a={'a':{'red':12,'green':23,'blue':34}}
    //({a:{red:12, green:23, blue:34}})
    b=a['a'] //or a.a
    //({red:12, green:23, blue:34})
    b.red = 122;
    b.green = 232;
    b.blue = 142;
    b
    //({red:122, green:232, blue:142})
    a
    //({a:{red:122, green:232, blue:142}})