Javascript 在node.js中,`module`始终是一个对象吗?

Javascript 在node.js中,`module`始终是一个对象吗?,javascript,node.js,module,logic,detection,Javascript,Node.js,Module,Logic,Detection,当我看到如何检测脚本是否在浏览器中运行与在浏览器中运行的示例时,我看到的逻辑如下: if (typeof module !== 'undefined' && module.exports) { // do something that applies to node } else { // do something that applies to browser } if (typeof module === 'object' && module

当我看到如何检测脚本是否在浏览器中运行与在浏览器中运行的示例时,我看到的逻辑如下:

if (typeof module !== 'undefined' && module.exports) {
    // do something that applies to node
} else {
    // do something that applies to browser
}
if (typeof module === 'object' && module.exports) {
    // do something that applies to node
} else {
    // do something that applies to browser
}
该列表将全局
模块
列为
{Object}
,我认为这意味着
模块的类型
应该始终是
“Object”
。在node中总是正确的吗?如果是这样的话,执行以下检测逻辑是否更有意义:

if (typeof module !== 'undefined' && module.exports) {
    // do something that applies to node
} else {
    // do something that applies to browser
}
if (typeof module === 'object' && module.exports) {
    // do something that applies to node
} else {
    // do something that applies to browser
}

第二个片段可能很好用。但是,不,我不认为这更有意义。你更关心它的存在,而不是它是什么。检查javascript中是否存在的标准方法是:

typeof myVar !== 'undefined'

因此,这里有一点JS惯例在起作用。

是的,到目前为止,在所有节点版本中,
模块一直是一个对象,并且可能在所有0.x版本中都是这样。至于检查它是否是一个特定的对象而不是未定义的对象是否有意义,这主要是风格的问题。在前一个示例中,由于代码可能只关心向
module.exports
添加属性,因此它更具表现力,不像编码时那么脆弱。例如,在未来版本的节点中,
模块
可能成为一个函数。在这种情况下,前一个示例仍然有效,而后一个示例需要稍作修改。

在这种情况下,两种形式在功能上是等效的。有鉴于此,我会选择两者中更常见的一种来改进