新的ObjectId()和新的ObjectId和ObjectId()之间有什么区别?
假设我在文件的开头有这个定义:
const ObjectId = mongoose.Types.ObjectId;
你应该select哪一个?为什么?
// 1 new ObjectId; // 2 new ObjectId(); // 3 ObjectId();
官方文档build议使用new ObjectId
。 对于我来说, new ObjectId()
感觉更自然,但是每一个都会产生一个新的ObjectId,而且我已经在SO的问答中看到了每个对象的例子。
http://mongoosejs.com/docs/api.html#types-objectid-js
更新:让我明白这一点:我知道为什么以及如何在JavaScript中使用一个新的运算符,我只是想了解当new
的ObjectID生成使用时,是否有任何显着的差异。 (该function行为不同,引发错误等…)
这些实例之间绝对没有差别。 让我通过各种方式来解释它是如何工作的:
-
new ObjectId
– 这是完全好,做new ObjectId();
相同的事情new ObjectId();
因为如果构造函数没有使用任何参数,您可以在没有括号的情况下实例化,请参阅new
运算符上的MDN文档 -
new ObjectId()
– 这是实例化一个对象的“标准”方式,相当于new ObjectId
-
ObjectId()
– 这和上面两个完全一样 。 这是因为源代码中的行:if(!(this instanceof ObjectID)) return new ObjectID(id);
上面的代码执行以下操作:
一个。
!(this instanceof ObjectID)
– 检查this
是否是ObjectID
一个实例。 这只有在构造函数被调用时使用new
才会引用当前实例,否则this
将是window
或undefined
取决于您是否处于严格模式。湾
return new ObjectID(id)
– 如果构造函数没有用new
调用,那么函数将返回new ObjectID(id)
。 这意味着,如果你在你的例子中调用ObjectId()
,函数将检测到这个并返回new ObjectID(id)
(或者如果没有给出id
,new ObjectID()
),所以它是完全一样的上述两个选项。
总之,没有function上的差异,只是你喜欢写它而已。 没有理由比其他function更偏好一个。
注意: ObjectID
和ObjectId
是一样的东西。 源代码状态如下: var ObjectId = ObjectID;
。
这与Javascriptdate对象类似。 但是,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