3

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

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

节点文档将全局module列为{Object}我认为typeof module应该始终是"object"的。这在节点中总是正确的吗?如果是这样,做如下检测逻辑不是更有意义:

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

2 回答 2

4

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

于 2012-08-10T21:14:55.667 回答
3

第二个片段可能会正常工作。但是,不,我不认为这更有意义。你关心它的存在远胜于关心它是什么。在 javascript 中检查是否存在的标准方法是:

typeof myVar !== 'undefined'

所以这里有一些 JS 约定。

于 2012-08-10T21:14:43.823 回答