92

JavaScript オブジェクト/変数には、ある種の一意の識別子がありますか? ルビーが持っているようにobject_id。DOM id 属性のことではなく、ある種のメモリ アドレスのことです。

4

5 に答える 5

64

基になるオブジェクトを変更せずにオブジェクトを一意の識別子で検索/関連付ける場合は、次を使用できますWeakMap

// Note that object must be an object or array,
// NOT a primitive value like string, number, etc.
var objIdMap=new WeakMap, objectCount = 0;
function objectId(object){
  if (!objIdMap.has(object)) objIdMap.set(object,++objectCount);
  return objIdMap.get(object);
}

var o1={}, o2={}, o3={a:1}, o4={a:1};
console.log( objectId(o1) ) // 1
console.log( objectId(o2) ) // 2
console.log( objectId(o1) ) // 1
console.log( objectId(o3) ) // 3
console.log( objectId(o4) ) // 4
console.log( objectId(o3) ) // 3

WeakMapの代わりにa を使用Mapすると、オブジェクトを確実にガベージ コレクションできます。

于 2016-02-10T02:56:33.040 に答える
51

いいえ、オブジェクトには識別子が組み込まれていませんが、オブジェクト プロトタイプを変更することで識別子を追加できます。これを行う方法の例を次に示します。

(function() {
    var id = 0;

    function generateId() { return id++; };

    Object.prototype.id = function() {
        var newId = generateId();

        this.id = function() { return newId; };

        return newId;
    };
})();

とはいえ、一般に、オブジェクト プロトタイプを変更することは非常に悪い習慣と見なされます。代わりに、必要に応じてオブジェクトに手動で ID を割り当てるか、他のtouch人が提案したように関数を使用することをお勧めします。

于 2010-01-07T14:14:45.720 に答える
11

object実際には、プロトタイプを変更する必要はありません。以下は、十分に効率的に、任意のオブジェクトの一意の ID を「取得」するために機能するはずです。

var __next_objid=1;
function objectId(obj) {
    if (obj==null) return null;
    if (obj.__obj_id==null) obj.__obj_id=__next_objid++;
    return obj.__obj_id;
}
于 2012-03-31T15:46:47.683 に答える