为什么原型函数40x比默认声明的函数慢



我玩过jsperf.com,发现原型函数比"默认"声明的函数慢40倍

String.prototype.contains = function(s){ return !!~this.indexOf(s) }=220K ops/s

与。

function isContains(str, s) { return !!~str.indexOf(s) }=8.5KK操作/s

下面是一个jsperf测试用例

附言:我知道原型修改不是最好的情况,可以称为"猴子补丁":)

我认为它很慢,因为每次调用方法时,字符串基元都会自动包装一个临时对象

这也解释了new Object("hi").foo()相对于"hi".foo()的性能提升。

来自MDN文档:

字符串文字(用双引号或单引号表示)和在非构造函数上下文中从String调用返回的字符串(即,不使用new关键字)是基元字符串。JavaScript自动转换基元和String对象,因此可以对基元字符串使用String对象方法。在对基元字符串调用方法或进行属性查找的上下文中,JavaScript将自动包装字符串基元并调用该方法或执行属性查找。

附近:

为什么可以';是否在javascript中为字符串对象添加属性?

字符串对象与文字-修改原型?

在monkey补丁版本中,用JavaScript主体替换C/machine代码中实现的基元函数的几率非常高。

最新更新