Node.JS表现得很奇怪

时间:2016-10-07 18:51:42

标签: javascript node.js

我有一个名为uids的变量

var uids = [];

然后我给它写了一些属性

uids[16778923] = "3fd6335d-b0e4-4d77-b304-d30c651ed509"

但在它之前

if (!uids[user.id]) {
 uids[user.id] = generateKey(user);
}

这件事表现不错。如果我试图获得它的属性值

uids[currentUser.id]

它会给我一个这个属性的值。如果我尝试调用某些方法,比如

Object.keys(uids);

它会给我,我所期待的。在这里,神秘来了......

uids;

RAM休息。 See the node eating ram

我现在很困惑。怎么了?

2 个答案:

答案 0 :(得分:4)

这是因为你正在创建一个庞大的数组,节点将为它保留内存 - 谁知道到底是什么。我说这是一个使用Map(或普通对象,但Map感觉更好的情况。

var uids = new Map();
var key = 456464564564654;
if (! uids.has(key)) {
    uids.set(key, generateKey(user))
}

答案 1 :(得分:1)

您正在创建一个空数组(长度为零),然后为任意索引分配一些值。这将使数组增长与索引一样大,并将值赋给该索引。使用node.js REPL:

查看此示例
> var a = []
undefined
> a[5] = "something"
'something'
> a
[ , , , , , 'something' ]
> a.length
6

您可以创建Map()或常见的javascript对象(singleton),而不是创建数组。 Javascript对象的行为类似于Maps,但只有字符串可以用作键。如果您将Number指定为键,则javascript会自动将其转换为String。

就个人而言,我会选择对象,因为它们表现更好。实例化一个对象比实例化一个Map要花费更长的时间(并且你似乎不需要创建几组“uids”),但是一旦完成,在使用公共对象时,添加新的键并从任何键中更快地检索值。至少在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.