大数突破 underscore.js _.contains

Big numbers break underscore.js _.contains

在调试 mongoose 回调时,我发现 underscore.js 或 JavaScript 语言本身似乎有大数字问题。

在下面的示例中,我存储了一个小数字和一个包含来自 mongoose 的 ObjectId(24 位数字)的字符串,以便尽可能清楚地显示问题。

var users = ["32", "300000000000000000000002"];
alert(_.contains(users, "32")); // true
alert(_.contains(users, (32).toString())); // true
alert(_.contains(users, "300000000000000000000002")); // true
alert(_.contains(users, (300000000000000000000002).toString())); // false - wait wat ?

我的问题当然是,如何使最后一次调用 return 为真?

我不想将数组 users 转换为数字数组,因为 (1) 该数组在生产环境中可能很大,并且 (2) 我可能需要对它进行其他操作数组。

不等于"300000000000000000000002"

的最后一个returns"3e+23"

问题始终是我得到一个自动转换为数字(由库)的输入字符串。所以我只需要让 'foreign key' 变小。我最终创建了一个自定义数字自动生成函数来规避这个问题:

var autoIncrement = require('mongoose-auto-increment');
var address = require('./Address');
var connection = mongoose.createConnection(address.mongo());
autoIncrement.initialize(connection);

var UserSchema = new mongoose.Schema({ /* property definitions */});
mongoose.model('User', UserSchema);

UserSchema.plugin(autoIncrement.plugin, {
    model: 'User',
    startAt: 10000001
});

因此,我不得不更改引用机制:

var GroupSchema = new mongoose.Schema({
    users: [{type: Number, ref: 'User'}],
    /* other property definitions */
});