给类的每个实例分配唯一id

简介: 给类的每个实例分配唯一id

给类的每个实例分配唯一id


学习vue源码的过程中,发现尤大经常给类的实例加上了唯一的id,后期判断或者添加的时候非常便捷,我觉得是个很好的技巧,本文就说下这个小技巧。

怎么分配id

其实分配id,操作起来很简单,如下所示就搞定了

let id = 0
class Dog{
  constructor(){
    this.id = ++id
  }
}
// {id:1},{id:2}
console.log(new Dog,new Dog)

分配id的好处

分配id的好处,当有个列表里面装很多实例的时候,

  • 方便去重
  • 方便判断某个实例在不在其中
  • 容易根据创建的顺序进行排序
  • 即便所有的属性相同,但id始终是不同的,方便调试
// 一个人可能养好几只狗
class Person{
  constructor(){
    this.dogs = []
    this.dogsId = []
  }
  addDog(dog){
    const hasDog = this.dogsId.includes(dog.id)
    if(!hasDog){
      this.dogs.push(dog)
      this.dogsId.push(dog.id)
    }
  }
  sortDog(){
      this.dogs.sort((x,y)=>x.id-y.id)
      this.dogsId.sort((x,y)=>x.id-y.id)
  }
}
const dog1 = new Dog()
const dog1Copy = {...dog1}
const person1 = new Person()
const dog2 = new Dog()
person1.addDog(dog2)
person1.addDog(dog1)
person1.addDog(dog1Copy)
person.sortDog()
// {dogs:[dog1,dog2],dogIds:[2,1]}
console.log(person1)

这里如果有基础的话,就会知道在没有id的情况下,也可以this.dogs.include(dog),这种缺点是没那么直观,复制的话,也不会区别。

分配id的场景

当然不需要列表存实例的话,其实不需要增加id的。

只有一些特定的场景,需要实例列表,而且强调唯一性的话,就可以考虑下。

这边看下vue这边的id使用:

let uid = 0
class Dep{
  constructor(){
    this.id = uid++
  }
}
class Watcher{
  constructor(){
    this.newDepIds = new Set()
    this.newDeps = []
  }
  addDep (dep) {
    const id = dep.id
    if (!this.newDepIds.has(id)) {
      this.newDepIds.add(id)
      this.newDeps.push(dep)
    }
  }
}


目录
相关文章
|
6月前
|
存储 NoSQL 数据库
全局id生成方式
全局id生成方式
|
3月前
|
Java 数据库连接 数据库
|
Kubernetes 关系型数据库 Perl
Job资源对象,与k8s存储
Job资源对象,与k8s存储
97 0
|
6月前
|
前端开发 算法 JavaScript
检查是否是类的对象实例
检查是否是类的对象实例
50 0
|
编译器 C语言 C++
【c++】 --- 对象的动态建立和释放
【c++】 --- 对象的动态建立和释放
49 0
|
SQL 机器学习/深度学习 算法
如何判断多账号是同一个人?用图技术搞定 ID Mapping
如何判断多个账号,它可能是一个邮箱,一个地址,一个手机对应着多个 ID,或者是多个同一前缀的邮箱,背后是同一个用户。如何进行这种关联性信息的收集,判断这些信息归属于同一人呢?
415 0
如何判断多账号是同一个人?用图技术搞定 ID Mapping
|
编译器
Integer 对象的实例
Integer 对象的实例
88 0
|
JavaScript 前端开发 Java
创建Class类的实例对象的三种方法
创建Class类的实例对象的三种方法
257 0
|
机器学习/深度学习 算法 安全
|
存储
六、小数据池、ID、编码
a = 20  b = 20 print(a==b)  这比较的是数值 print(a is b)  这是比较内存地址  is print(id(a))  查看变量地址    小数据池 数字类型:     如果几个变量的值都为数字且都在-5~256 之间   则几个变量的的内存地址是一样的 这样的话就可以节省内存                       空间 字符串:     1、如果存在特殊字符 则不存在小数据池 其他都不存在数据池 编码 python3x 中的编码: python3x 中 str 在内存中的编码方式是unicode。
1008 0