2017-06-13 58 views
2

在ES6中,地圖和集合可以使用對象作爲關鍵字。但是,由於ES6規範沒有規定這些數據結構的底層實現,所以我想知道現代JS引擎如何存儲密鑰以保證O(1)或至少sublinear檢索?ES6地圖和集合:對象索引如何有效地索引?

在像Java這樣的語言中,程序員可以明確地提供一個(好的)hashCode方法,它將密鑰均勻地散列在密鑰空間中以保證性能。然而,由於JS沒有這樣的特性,仍然認爲他們在Maps和Sets實現中使用某種哈希算法仍然公平。

任何信息將不勝感激!

+0

是的,當然他們使用哈希。而且因爲你不能指定你自己的平等,你也不需要實現你自己的散列函數。他們只是用於對象身份。 – Bergi

+1

[es6地圖和設置複雜性,v8實現](https://stackoverflow.com/q/33611509/1048572)可能的重複?如果回答你的問題,我會關閉。 – Bergi

+0

啊我看到了,所以我明白他們使用對象標識來檢查是否相等。但他們如何獲得哈希位置?某種memoryAddress%keySpace? – luanped

回答

3

是的,該實現基於散列,並具有(分期付款)不斷的訪問時間。

「他們使用對象身份」是一種簡化;完整的故事是ES Maps和Sets使用SameValueZero算法確定相等性。根據這個規範,V8的實現爲字符串和數字計算「真實」哈希值,併爲對象選擇一個隨機數作爲「哈希」,它將這些數據作爲私有(隱藏)屬性存儲在這些對象上以供以後訪問。 (這不太理想,將來可能會改變,但現在就是這樣)

使用memoryAddress % keySpace無法工作,因爲垃圾回收器會移動對象,並且每當任何對象可能移動時重新刷新所有地圖和集將過於複雜和昂貴。