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

  • ObjectId()
    -这是与上述两个完全相同的。这是因为以下内容中的行:

    上述代码执行以下操作:

    a<代码>!(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);