Javascript new ObjectId()与new ObjectId和ObjectId()之间的区别是什么?
假设我在文件开头有此定义:Javascript new ObjectId()与new ObjectId和ObjectId()之间的区别是什么?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,假设我在文件开头有此定义: const ObjectId = mongoose.Types.ObjectId; 你更喜欢哪一个?为什么 // 1 new ObjectId; // 2 new ObjectId(); // 3 ObjectId(); 官方文件建议使用新ObjectId。对我来说,new ObjectId()感觉更自然,但它们都会生成一个新的ObjectId,我在SO的问答中看到了它们各自的示例 更新: 让我澄清一下:我知道为什么以及如何在JavaScript中使用
const ObjectId = mongoose.Types.ObjectId;
你更喜欢哪一个?为什么
// 1
new ObjectId;
// 2
new ObjectId();
// 3
ObjectId();
官方文件建议使用新ObjectId
。对我来说,new ObjectId()
感觉更自然,但它们都会生成一个新的ObjectId,我在SO的问答中看到了它们各自的示例
更新:
让我澄清一下:我知道为什么以及如何在JavaScript中使用一个新操作符,我只想知道当
new
用于ObjectID生成时是否有任何显著的区别。(函数行为不同,抛出错误等…这与Javascript日期对象类似。但是,Date对象返回的结果略有不同。例如:
new Date(); // returns current date as object
Date(); // returns current date as string
在Javascript中实例化对象最常见的方法是显式调用构造函数,最后是括号
new ObjectID();
无论是否传递参数,这都会保持一致性
最后,并非所有静态调用自己的类都会返回可预测的结果
Array() // returns []
String() // returns ""
Date() // returns current date as a string, not an object
这些实例化之间绝对没有区别。让我逐一介绍并解释其工作原理:
-这完全没问题,与newobjectid
newobjectid()做的事情相同代码>因为如果构造函数不带任何参数,则可以不带括号进行实例化,请参见
运算符上的new
-这是实例化对象的“标准”方式,相当于newobjectid()
newobjectid
-这是与上述两个完全相同的。这是因为以下内容中的行: 上述代码执行以下操作: a<代码>!(ObjectID的此实例)-检查ObjectId()
是否为此
-如果未使用ObjectID的实例。如果使用
调用构造函数,则这是唯一正确的,其中new
将引用当前实例,否则此
将是此
或窗口
,具体取决于您是否处于严格模式 b<代码>返回新ObjectID(id)未定义
调用构造函数,则函数将返回new
。这意味着,如果在示例中调用新ObjectID(id)
,函数将检测到这一点并返回ObjectId()
(或者如果未给出newobjectid(id)
,则返回id
),因此它与上述两个选项完全相同newobjectid()
注意:
ObjectID
和ObjectID
是相同的东西。源代码声明:var ObjectId=ObjectId
很好地解释了新的
操作符(以及为什么如果没有它,构造函数很可能会表现得有点奇怪)。感谢您的详细说明。至少在Node.JS中测试mongodb之后,唯一无效的是ObjectId无效。Mongodb包“Mongodb”:“^2.2.30”
这里只接受ObjectID
(ID大写):否则您可能会得到以下错误:node\u modules\Mongodb\lib\mongo\u client.js:429抛出错误引用错误:ObjectID未定义
。正如您所说,这两种语法都适用于ObjectID()
或newobjectid()
@JuniorM我说的是Mongoose,而不是一般的MongoDB。猫鼬公开ObjectId和ObjectId。
if(!(this instanceof ObjectID)) return new ObjectID(id);