tinkerbeast
tinkerbeast

Reputation: 2077

JavaScript object creation / associativity

Can someone please explain the output behaviour of the following code snippet?

function Vertex(x, y, z) {
    this.x = parseInt(x);
    this.y = parseInt(y);
    this.z = parseInt(z);
};

var set = {};

var v1 = new Vertex(1,2,3);
var v2 = new Vertex(2,3,4);
var v3 = new Vertex(1,2,3);
var v4 = new Vertex(4,5,6);

set[v1] = 10;
set[v2] = 11;


alert(set[v1] + " " + set[v2] + " " + set[v3] + " " + set[v4]);
// Output: 11 11 11 11

Upvotes: 2

Views: 80

Answers (2)

Louis Ricci
Louis Ricci

Reputation: 21116

v1 == v2 == v3 == v4 == "[object Object]" when expressed as a string

You can't have an object as a key.

set[v1] is the same as set["[object Object]"]

This is why you're getting the last value for all 4 keys.

Here is you're code reworked to perform as intended

var object_id = 0; /* global object instance id */
function Vertex(x, y, z) {
    this.x = parseInt(x);
    this.y = parseInt(y);
    this.z = parseInt(z);
    this.id = (object_id++); /* add id to object */
};
/* override to string so it can be used as a key */
Vertex.prototype.toString = function() {
    return JSON.stringify(this);
}

var set = {};

var v1 = new Vertex(1,2,3);
var v2 = new Vertex(2,3,4);
var v3 = new Vertex(1,2,3);
var v4 = new Vertex(4,5,6);

set[v1] = 10;
set[v2] = 11;


alert(set[v1] + " " + set[v2] + " " + set[v3] + " " + set[v4]);

Upvotes: 1

Musa
Musa

Reputation: 97727

Object properties are strings so if you try to do set[v1] = 10;, v1 will be converted to a string (the string will be [object Object]) so essentially you'll get set['[object Object]'] = 10; this will occur for all your objects and each value you set will overwrite the previous.

So you code is equivalent to this

function Vertex(x, y, z) {
    this.x = parseInt(x);
    this.y = parseInt(y);
    this.z = parseInt(z);
};

var set = {};

var v1 = new Vertex(1,2,3);
var v2 = new Vertex(2,3,4);
var v3 = new Vertex(1,2,3);
var v4 = new Vertex(4,5,6);

set['[object Object]'] = 10;
set['[object Object]'] = 11;          

alert(set['[object Object]'] + " " + set['[object Object]'] + " " + set['[object Object]'] + " " + set['[object Object]']);
// Output: 11 11 11 11

Upvotes: 3

Related Questions