有人可以解释下面代码片段的输出行为吗?
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
答案 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]);