JavaScript对象ID

tre*_*nik 70 javascript unique-id

JavaScript对象/变量是否具有某种唯一标识符?就像Ruby一样object_id.我不是指DOM id属性,而是某种某种类型的内存地址.

Xav*_*avi 42

不,对象没有内置标识符,但您可以通过修改对象原型来添加一个.这是一个如何做到这一点的例子:

(function() {
    var id = 0;

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

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

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

        return newId;
    };
})();
Run Code Online (Sandbox Code Playgroud)

也就是说,一般来说修改对象原型被认为是非常糟糕的做法.我建议您根据需要手动为对象分配id或使用touch其他人建议的功能.

  • 这个例子可以用作闭包和原型继承的一个很好的使用例子。 (2认同)

Phr*_*ogz 40

如果要在不修改基础对象的情况下查找/关联具有唯一标识符的对象,可以使用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
Run Code Online (Sandbox Code Playgroud)

使用a WeakMap确保仍然可以对对象进行垃圾回收.

  • 最佳答案!使用内存 O(n),其中 n 是您关心的 ID 的对象数量(而不是 n=所有对象),并且不影响垃圾回收。 (2认同)

Kal*_*lEl 9

实际上,您不需要修改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;
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您希望对象之后具有不同的ID,那么这对于大多数复制对象的方式都不会很好. (7认同)