簡體   English   中英

Node.JS表現異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM