Reputation: 2077
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
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
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