使用JavaScript创建唯一的对象标识符

5

客户端使用的对象需要唯一的ID。我的对象数组非常小,通常只有4个项目,不会更多。

我使用以下代码:

export class MyItem {   
    uniqueObjectIdentifier: number;
    constructor(obj) {    
        this.uniqueObjectIdentifier = Math.random();
    }
}

有没有什么可能是JavaScript或Angular内部的东西,我可以访问,而不是手工制作的属性?


不标记,因为我对angulartypescriptecmascript-6了解不够,但这是否与此问题相同? - Max von Hippel
Math.random() 函数有什么问题吗? - bhantol
1
Math.random() 不是唯一的。在 JavaScript 中,它实际上是伪随机数,因此最终会重复出现。 - Ori Drori
你想用这个ID做什么?为什么认为你需要它们?每个对象已经有一个身份,可以将其与其他对象区分开来。 - Bergi
这里我找到了一个解决方案:https://dev59.com/2nI-5IYBdhLWcg3wFkOO。JavaScript没有内置的标识符。我在客户端为数据网格创建对象。当前正在编辑的对象显示编辑模板,为此我需要唯一的ID :-) - Elisabeth
2个回答

7
你可以使用Symbol

从 Symbol() 返回的每个符号值都是唯一的。

export class MyItem {
  uniqueObjectIdentifier: symbol;
  constructor(obj) {
    this.uniqueObjectIdentifier = Symbol();
  }
}

如果浏览器不支持使用符号,您可以使用对象的引用代替。
export class MyItem {
  uniqueObjectIdentifier: object;
  constructor(obj) {
    this.uniqueObjectIdentifier = {};
  }
}

就像你之前问的bhantol一样,Math.random()没有任何问题。只是好奇十年后...这种东西是如何处理的 :-) - Elisabeth
1
符号值可以用作对象属性的标识符。内置了一些特殊符号,例如迭代器。此外,符号的目的是成为唯一标识符。对象的目的是成为一个对象。在这方面,{}new MyItem()之间没有区别。 - Ori Drori
1
@bhantol Symbol 是类似于 Object 的对象,但比真正的 Object 简单得多。例如,您无法为 Symbol 分配自定义属性。因此,它可能需要更少的内存。 - user6445533
3
Math.random() 的作用是生成一个随机数,而非唯一性。;-) - Elisabeth
1
为什么浏览器支持是一个问题呢?这可以通过符号填充解决,而填充在每个Web项目中都是一等公民。 - Estus Flask
显示剩余3条评论

2
TypeScript中,您可以这样做:
export class MyItem {
  static currentId: number = 0;
  uniqueObjectIdentifier: number;

  constructor(obj) {
    this.uniqueObjectIdentifier = MyItem.currentId++;
  }
}

JavaScript ES6中:

export class MyItem {
  constructor(obj) {
    this.uniqueObjectIdentifier = MyItem.currentId++;
  }
}
MyItem.currentId = 0;

或者你可以使用未公开的模块范围变量来保存计数器:

let currentId = 0;

export class MyItem {
  constructor(obj) {
    this.uniqueObjectIdentifier = currentId++;
  }
}

这样做可以防止currentId被从模块外部修改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接