JavaScript对象创建/关联性

时间:2012-10-10 19:06:48

标签: javascript constructor associative-array

有人可以解释下面代码片段的输出行为吗?

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

2 个答案:

答案 0 :(得分:3)

对象属性是字符串,因此如果您尝试set[v1] = 10;v1将转换为字符串(字符串将为[object Object]),因此基本上您将获得{{1}这将发生在你的所有对象上,你设置的每个值都将覆盖前一个。

所以你的代码等同于

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

答案 1 :(得分:1)

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

您不能将对象作为密钥。

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

这就是为什么你得到所有4个键的最后一个值。

您需要重新编写代码才能按预期执行

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]);