💪第6期第2题:如何判断当前脚本运行在浏览器还是 node 环境中?
Opened this issue · 0 comments
LinDaiDai commented
如何判断当前脚本运行在浏览器还是 node 环境中?
这道题呆呆其实在很多地方都看到了,但是有的回答好像并不那么靠谱。
回答这道题首先我们需要知道一个概念:
浏览器环境:全局对象为window
;而在node
环境下,是有一个名为global
的对象,它的内部Class属性
是为"global"
。
内部Class属性
也就是我们通过Object.prototype.call(obj)
这种方式来获取到的内容,比如:
console.log(Object.prototype.toString.call([1, 2, 3])); // "[object Array]"
(关于它的用法呆呆在《【精】从206个console.log()完全弄懂数据类型转换的前世今生(上)》中的toString
用法时说的也很详细咯)
因此我们可以得出这种判断方式:
var isBrowser = typeof window !== 'undefined'
&& ({}).toString.call(window) === '[object Window]';
var isNode = typeof global !== "undefined"
&& ({}).toString.call(global) == '[object global]';
({}).toString.call()
和Object.prototype.toString.call()
用法一致,只不过在{}
的外面最好加上一个()
,也是为了预防JS
将大括号{}
认为是一个空的代码块(额,呆呆试了一下貌似也没有这方面的问题)。