好的,所以我编写了这个简单的javascript函数,使我的代码更具可读性:
Number.prototype.isBetween=function(a,b){
return(this>=a&&this<b);
};
现在结果非常缓慢:我试过这个&#34;基准测试&#34; (我真的不知道如何正确地做这些事情,但这证明了我的观点):
var res=0;
var k=20;
var t=new Date().getTime();
for(var i=0;i<10000000;i++){if(k.isBetween(13,31)){res++;}}
console.log(new Date().getTime()-t);
与
var res=0;
var k=20;
var t=new Date().getTime();
for(var i=0;i<10000000;i++){if(k>=13&&k<31)){res++;}}
console.log(new Date().getTime()-t);
并且第一个脚本需要大约3000毫秒的chrome(而chrome是我正在使用的和我感兴趣的东西),而第二个脚本只需要24ms - 整个因子125 更快。是扩展现有的类javascript提供了一个非常糟糕的主意?这是怎么回事?
答案 0 :(得分:8)
原因是,对于要应用的方法isBetween
,主题 k 需要转换为Number
对象。这称为拳击或primitive wrapping。
然后应用isBetween
方法,比较运算符>
将需要从this
对象中检索原始值,...两次。
这是附加函数调用(涉及堆栈)之上的所有额外开销。
这个总开销比需要发生的实际比较更多,因此性能影响相对较大。
正如@Bergi在下面的评论中提到的,上述包裹does not happen in strict mode MDN:
作为
this
传递给 strict mode 中的函数的值不会被强制成为对象(a.k.a。“boxed”)。 [...]自动装箱[是]性能成本[...]因此对于严格模式函数,指定的this
不会被装入对象。
当切换到严格模式时,您会发现增加的性能成本会消失:
"use strict";