2

誰かが次のコードスニペットの出力動作を説明できますか?

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
4

2 に答える 2

3

オブジェクトのプロパティは文字列であるため、実行しようとするとset[v1] = 10;v1文字列に変換されます(文字列はになります[object Object])。したがって、基本的にset['[object Object]'] = 10;これはすべてのオブジェクトで発生し、設定した各値は前の値を上書きします。

したがって、コードはこれと同等です

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
于 2012-10-10T19:12:02.707 に答える
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]);
于 2012-10-10T19:12:48.403 に答える