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其他人建议的功能.
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确保仍然可以对对象进行垃圾回收.
实际上,您不需要修改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)
| 归档时间: |
|
| 查看次数: |
90884 次 |
| 最近记录: |