new ObjectId() 和 new ObjectId 和 ObjectId() 有啥区别?

Posted

技术标签:

【中文标题】new ObjectId() 和 new ObjectId 和 ObjectId() 有啥区别?【英文标题】:What is the difference between new ObjectId() and new ObjectId and ObjectId()?new ObjectId() 和 new ObjectId 和 ObjectId() 有什么区别? 【发布时间】:2017-10-31 03:35:11 【问题描述】:

假设我在一个文件的开头有这个定义:

const ObjectId = mongoose.Types.ObjectId;

你应该更喜欢哪一个?为什么?

// 1 
new ObjectId;  

// 2
new ObjectId();

// 3
ObjectId();

官方文档建议使用new ObjectId。对我来说new ObjectId() 感觉更自然,但它们中的每一个都会生成一个新的 ObjectId,我在 SO 的问题和答案中看到了它们中的每一个的示例。

http://mongoosejs.com/docs/api.html#types-objectid-js

更新: 让我澄清一下:我知道为什么以及如何在 javascript 中使用 new 运算符,我只是想知道当 new 用于 ObjectID 生成时是否有任何显着差异。 (函数行为不同,抛出错误等......)

【问题讨论】:

MDN 很好地解释了 new 运算符(以及为什么如果没有它调用构造函数,它们的行为很可能会有点奇怪)。 【参考方案1】:

这些实例之间的差异绝对为零。让我通过每一种方式来解释它是如何工作的:

new ObjectId - 这完全没问题,与new ObjectId(); 做同样的事情,因为如果构造函数不带任何参数,您可以不带括号进行实例化,请参阅the MDN documentation 上的new 运算符

new ObjectId() - 这是实例化对象的“标准”方式,等效于new ObjectId

ObjectId() - 这与上述两个完全相同。这是因为source code中的那一行:

if(!(this instanceof ObjectID)) return new ObjectID(id);

上面的代码做了以下事情:

一个。 !(this instanceof ObjectID) - 检查 this 是否是 ObjectID 的实例。这只有在使用 new 调用构造函数时才为真,其中 this 将引用当前实例,否则 this 将是 windowundefined,具体取决于您是否在严格模式下。

b. return new ObjectID(id) - 如果构造函数没有new调用,那么函数将返回new ObjectID(id)。这意味着如果您在示例中调用ObjectId(),该函数将检测到这一点并返回new ObjectID(id)(或者如果没有给出id,则返回new ObjectID()),因此它与上述两个选项完全相同。

总之,没有功能上的区别,这取决于你喜欢怎么写。没有理由在功能上偏爱其中一个。


注意:ObjectIDObjectId 是同一个东西。源代码声明:var ObjectId = ObjectID;

【讨论】:

感谢您详细说明。唯一无效的,至少在 Node.JS 中测试 mongodb 之后是 ObjectId 无效。 Mongodb包"mongodb": "^2.2.30"这里只接受ObjectID(ID大写):否则你会得到这个错误:node_modules\mongodb\lib\mongo_client.js:429 throw err ReferenceError: ObjectId is not defined。正如您所说,这两种语法都可以使用 ObjectID()new ObjectID() @JuniorM 我说的是 Mongoose,而不是一般的 MongoDB。 Mongoose 公开 ObjectId 和 ObjectID。

以上是关于new ObjectId() 和 new ObjectId 和 ObjectId() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 在结果的 _id 字段中返回“new ObjectId”

数组声明和使用要点

javascript中new Object 该不该加括号?

java,根据一个动态的map如何动态 往 Object[] array=new Object[];添加值

创建一个引用集合的 ObjectId 的文档

mongodb:从 json 查询中的 ObjectID 中提取时间戳