[英]Node.JS behaves strange
我有一個名為uids的變量
var uids = [];
然后我給它寫一些值屬性
uids[16778923] = "3fd6335d-b0e4-4d77-b304-d30c651ed509"
但在此之前
if (!uids[user.id]) {
uids[user.id] = generateKey(user);
}
這東西表現不錯。 如果我嘗試獲取it屬性的值
uids[currentUser.id]
它會給我這個屬性的價值。 如果我嘗試調用某些方法,例如
Object.keys(uids);
它會給我我所期望的。 神秘來了...
uids;
RAM碎片。 看節點吃公羊
我現在很困惑。 怎么了?
這是因為您正在創建一個巨大的數組,節點將為其保留內存-誰知道會發生什么。 我想說的是您會使用Map
(或普通對象)的情況,但是Map
在這里感覺更好。
var uids = new Map();
var key = 456464564564654;
if (! uids.has(key)) {
uids.set(key, generateKey(user))
}
您正在創建一個空數組(長度為零),然后將一些值分配給任意索引。 這將使數組增長到與索引一樣大,並將值分配給該索引。 使用node.js REPL查看此示例:
> var a = []
undefined
> a[5] = "something"
'something'
> a
[ , , , , , 'something' ]
> a.length
6
除了創建數組之外,您還可以創建Map()或常見的javascript對象(單例)。 Javascript對象的行為類似於Maps,但只有字符串可以用作鍵。 如果您將數字指定為鍵,則javascript會自動將其轉換為字符串。
就個人而言,我會選擇對象,因為它們的性能更好。 實例化一個對象要比實例化一個Map花更長的時間(似乎不需要創建幾組“ uid”),但是一旦完成,添加新鍵並在使用公共對象時可以更快地從任何鍵中檢索值。 至少這就是我在ubuntu 14.04上的node.js v6.7.0中運行的方式,但是您可以自己嘗試。 而且這也將對您的代碼進行最少的改動。
var uids = {} // common/ordinary empty javascript object instead of array.
if (!uids[user.id]) { // getting value from one key works the same.
uids[user.id] = generateKey(user) // assignment works the same.
}
////
uids[16778923] = "3fd6335d-b0e4-4d77-b304-d30c651ed509" // key will be "16778923".
uids[16778923] // getting value for key "16778923" can be done using 16778923 instead of "16778923".
////
uids[currentUser.id] // still returning values like this.
Object.keys(uids) // still returning an array of keys like this. but they are all Strings.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.