Explict Memory Managment

Brendan Eich brendan at mozilla.com
Fri May 22 14:13:14 PDT 2009

On May 22, 2009, at 2:06 PM, Brendan Eich wrote:

> On May 22, 2009, at 1:53 PM, David Semeria wrote:
>>> First, null is not a "value" in the sense of object value. An object
>>> takes up arbitrary space associating property names with values.
>>> You're possibly confusing reference and referent again.
>> That's very likely - I have only a very rudimentary idea of how the
>> language is implemented in the browser.
> It's not only an implementation issue. The language has reference  
> types -- objects -- and mutation. Sometimes you must know about how  
> more than one reference to an object being modified can affect the  
> different reference holders, even if you are a language user only  
> and not a language implementor.

The simplest case:

var obj = {hi: "there"};
var frobj = obj; // did we copy obj?
frobj.hi = "bye";
alert(obj.hi); // no, we copied the reference

Notice that string is apparently a value type. You can't mutate  
primitive strings, so implementations can and do use references to  
shared immutable strings under the hood (even to shared mutables, with  
reference-counting or other tricks to avoid exposing the optimization)  
under the hood. Of coure number, boolean, and the hidden types of null  
and undefined are value types.

Because object is a reference type, people sometimes want something like

function copy(obj) {
     var clone = {};
     for (var i in obj)
         clone[i] = obj[i];
     return clone;

This assumes obj is an Object instance, without getters or setters,  
etc. See the Object.extend thread for more:


and jresig's super-duper implementation at


This could use ES5's Object meta-programming methods instead of  
__lookupProperty__, but then it wouldn't work in extant browsers.


More information about the es-discuss mailing list