Javascript instanceof 究竟是如何工作的?是慢风格吗?
对于“巨大的库”来说,instanceof
的性能如何?
它是否沿着原型链一个接一个向上移动,与此类似? :
//..
var _ = john.constructor;
while (true) {
if (_ === Human) {
return true;
}
_ = _.prototype.constructor
}
return false;
//..
与在每个对象的属性中存储唯一的接口 ID 号相比,instanceof
的性能是否相对较差。
How does the performance of instanceof
fair for "huge libraries"?
Does it travel up the prototype chain one by one, similar to this? :
//..
var _ = john.constructor;
while (true) {
if (_ === Human) {
return true;
}
_ = _.prototype.constructor
}
return false;
//..
Is instanceof
relatively unperfomant then, compared to storing a unique interface id number in the property of every object.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在 V8(Chrome 的 JS 引擎)中,似乎几乎没有性能影响:
Firefox 显示了相同的行为。
这里有点疯狂,但是:
我认为如果它可以钻取 10,000 个类并且看不到 1 毫秒的性能差异,那么可以安全地假设不会影响性能:)
in V8 (Chrome's JS engine), there seems to be little-to-no performance hit:
Firefox shows identical behavior.
Going a bit crazy here, but:
I think it's safe to assume there is no performance hit if it can drill through 10,000 classes and not see 1 ms performance difference :)
是的,类似的事情。以下是规范中的相关部分:
其中调用 [[HasInstance]] 方法定义为
关于性能:这可能取决于浏览器中的实际实现。它们之间可能存在巨大差异,因此最好的办法是制定一些基准测试,例如使用 http://jsperf.com/。
instanceof
的一个问题是,如果您在来自不同上下文(例如框架或 iframe)的元素上调用它,它可能无法工作。例如,让a
是一个可以通过iframe.contentWindow.a
访问的对象,并且你想测试它是否是一个数组,那么将返回
false< /代码>。
Yeah something like that. Here is the relevant part from the specification:
where calling the [[HasInstance]] method is defined as
Regarding performance: This probably depends on the actual implementations in the browsers. There can be huge differences between them so the best thing would be to make some benchmarks, e.g. with http://jsperf.com/.
A problem with
instanceof
is that it might not work if you invoke it on elements from different contexts, such as a frame or iframe. For example, leta
be an object you can access viaiframe.contentWindow.a
and you want to test whether it is an array, thenwill return
false
.根据 Felix Kling 的引用,instanceof 所做的一切(不包括错误检查)都是检查 Function 的原型属性(必须是一个对象)是否可以在原型链的某个位置找到,
下面是一些伪代码:
According to what Felix Kling quoted, all that instanceof does (excluding the error checks) is to check whether the prototype property(which has to be an object) of the Function can be found somewhere down the prototype chain
Here's some pseudocode: