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:

https://mail.mozilla.org/pipermail/es-discuss/2008-July/006709.html

and jresig's super-duper implementation at

http://ejohn.org/files/object-extend.js

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

/be
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to