我想生成一個從 anObject的參考派生的散列,然后將散列字串與物件本身關聯到字典中。
我聽說過object-hash并嘗試了以下實作:
const objectHash = require('object-hash');
class A {
a: string;
constructor() {
this.a = '1';
}
}
let a = new A();
let ab = new A();
console.log(objectHash(a)); // 712041d72943c4794bb23d1d455e17b3a4ea17f5
console.log(objectHash(ab));// 712041d72943c4794bb23d1d455e17b3a4ea17f5
盡管 ofa和ab是不同的物件(雖然是同一個類的實體),但產生的哈希值是相等的,這不是預期的結果。那是因為庫散列物件值而不是物件參考。
預期結果
let foo = new A();
let bar = new A();
const fooH = objectHash(foo); <-- Produces a unique hash string representing the reference of "foo"
const barH = objectHash(bar); <-- Produces a unique hash string representing the reference of "bar"
let objects = {
fooH: foo,
barH: bar
}
這可能可以通過使用指標和地址在 C 或 C# 中實作,但是 Javascript 呢?如果有人可以指導我將物件的參考封裝到字串中的正確路徑,我將不勝感激。
uj5u.com熱心網友回復:
不可能在 JavaScript 中獲取物件的參考來計算它的哈希值。參考是引擎的內部值,通常不會暴露。
但是,如果您想針對某個物件對某些資料進行索引,則可以使用 a Map,因為鍵可以是任意 JavaScript 值,從而允許物件。由于物件在比較期間是唯一的,這意味著同一個物件回傳值:
class A {
constructor() {
this.a = '1';
}
}
const foo = new A();
const bar = new A();
const map = new Map()
.set(foo, "hello")
.set(bar, "world");
console.log(map.get(foo), map.get(bar));
JavaScript 也有一個WeakMap- 它只允許物件作為鍵,但反過來它只持有對它們的弱參考。這意味著一旦對鍵的任何其他參考消失,WeakMap將不會阻止物件被垃圾收集。
Maps,尤其是 WeakMaps,是一種擴展外來物件的可行方法,而實際上不必將它們嵌套在您自己的層次結構中。這是一個快速演示
import {a, b} from 'foreign';
const extension = new WeakMap()
extension.set(a, {
myProperty1: true,
myProperty2: 40,
myProperty3: "hello",
});
extension.set(b, {
myProperty1: false,
myProperty2: 2,
myProperty3: "world"
});
在這里,我們得到了一些外來物件a,b我們不需要用我們自己的屬性來控制和擴展它們,也不需要更改或克隆它們。在 中查看物件會WeakMap提供擴展屬性。
查看本杰明·格魯恩鮑姆( Benjamin Gruenbaum)的更詳細描述
For further reference a Set and a WeakSet exhibit the same properties as a Map and WeakMap, respectively, in terms of storing objects. However, they without an extra value for the object. That can be useful, for example, to keep track of seen objects. Which event handlers have fired, or which nodes in a graph have been visited, and similar.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/358228.html
標籤:javascript node.js reference
上一篇:如何使用javascript從html保存/寫入檔案?
下一篇:事件不會從子元素冒泡到父元素
