Javascript 性能:typeof vs instanceof

Javascript 性能:typeof vs instanceof,javascript,performance,instanceof,typeof,Javascript,Performance,Instanceof,Typeof,我想知道typeof和instanceof中哪一种性能更好,所以我总结了以下几点: let TIMES=1000*1000*100 console.time((()=>{})instanceof函数) for(设i=0;i{})实例 console.timeEnd((()=>{})instanceof函数) time(((async()=>{})instanceof函数) for(设i=0;i{})instanceof函数 timeEnd(((async()=>{})instanceof函数)

我想知道
typeof
instanceof
中哪一种性能更好,所以我总结了以下几点:

let TIMES=1000*1000*100
console.time((()=>{})instanceof函数)
for(设i=0;i{})实例
console.timeEnd((()=>{})instanceof函数)
time(((async()=>{})instanceof函数)
for(设i=0;i{})instanceof函数
timeEnd(((async()=>{})instanceof函数)
time(((函数(){})函数的instanceof)
for(设i=0;i{})==='function'”)
for(设i=0;i{})==='function'
timeEnd(“typeof(()=>{})==='function'”)
time(“typeof(async()=>{})=='function'”)
for(设i=0;i{})==='function'
timeEnd(“typeof(async()=>{})==='function'”)
time(“typeof(function(){})==“function”)
for(设i=0;i
从Chrome 66的控制台上获得了这些超级酷的结果:

(()=>{})函数实例:1789.8449703125ms
函数的(async()=>{})实例:2229.64208984375ms
(函数(){})函数的实例:1954.09716796875ms
(异步函数(){})函数的实例:2279.995849609375ms
typeof(()=>{})=='function':412.8701171875ms
typeof(async()=>{})=='function':413.337890625ms
typeof(function(){})==“function”:413.387939453125毫秒
typeof(异步函数(){})==“函数”:412.910888671875ms
Firefox59花了很长时间才运行该XD

我没有足够的耐心等待它,因此我的工资减少了十倍:

let TIMES=1000*1000*10
有了这些,我从Firefox 59的控制台获得了以下信息:

(()=>{})函数实例:5490ms
函数的(async()=>{})实例:6884ms
(函数(){})函数的实例:5408ms
(异步函数(){})函数的实例:6938ms
类型(()=>{})=='function':1916ms
typeof(async()=>{})=='function':1998ms
typeof(function(){})=“function”:1976ms
typeof(异步函数(){})==“函数”:1972ms
这两个结果集都表明
typeof
instanceof
快得多,这一点其他一些人在本文中也提到过


我的问题是“y tho”

正如您从SO中预测和显示的其他链接,
typeof
将更快(jsperf:),这是有意义的,因为
typeof
将返回一个内置类型(对象、未定义和原语)同时控制操作数的
实例的右侧。这意味着
instanceof
操作符应该检查原型链,看看右侧是否被用作构造函数。这当然需要更多的工作。

但两者不能互换。在某些情况下,两个操作符的用例都有所不同。请参阅。
typeof
只检查类型(一个简单的检查),
instanceof
还检查它是否属于一个超类(多个检查)。我的猜测是因为VM中的变量在默认情况下有一个与它们相关联的类型标记,这比跟踪原型链的指针检查更快。在这种情况下,
(()=>{}).protoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoprotoproto。考虑到proto类似于
对象。getPrototypeOf
,似乎仍然是,typeof在幕后更快,无论做什么,都比对象属性访问更便宜。这只是关于使用单行性能测试的一般提醒,而不必过多关注细节(优化是主要因素,cpu时钟精度…)。这就是我否决95%以上“性能测试”的原因关于stackoverflow,它盲目地从拙劣的测试中得出结论。我并不是说结果是错误的,只是奇怪的jsperf测试不应该是论证的基础。不应该,我同意。有很多瓶颈需要优化,直到它归结为不可解析的内置规范之间的对比。我也不认为可以公平地比较his,因为这两个操作数根本不相同。