JavaScript对象ID

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

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

提问于
用户回答回答于

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

(function() {
    var id = 0;

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

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

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

        return newId;
    };
})();

也就是说,通常修改对象原型被认为是非常糟糕的做法。相反,我会建议您根据需要手动将对象分配给对象,或使用touch其他人建议的功能。

用户回答回答于

如果您想在不修改底层对象的情况下查找/关联具有唯一标识符的对象,则可以使用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

使用a WeakMap确保对象仍然可以被垃圾收集。

扫码关注云+社区