在关注扩展String.prototype的性能问题时,我非常感兴趣,因为仅仅给String.prototype
方法添加"use strict"
就可以提高10倍性能。由bergi提供的解释很简短,没有给我解释清楚。为什么两个几乎相同的方法之间会有如此明显的差异,仅在开头的"use strict"
不同?你能否详细解释一下并说明其背后的理论呢?
String.prototype.count = function(char) {
var n = 0;
for (var i = 0; i < this.length; i++)
if (this[i] == char) n++;
return n;
};
String.prototype.count_strict = function(char) {
"use strict";
var n = 0;
for (var i = 0; i < this.length; i++)
if (this[i] == char) n++;
return n;
};
// Here is how I measued speed, using Node.js 6.1.0
var STR = '0110101110010110100111010011101010101111110001010110010101011101101010101010111111000';
var REP = 1e4;
console.time('proto');
for (var i = 0; i < REP; i++) STR.count('1');
console.timeEnd('proto');
console.time('proto-strict');
for (var i = 0; i < REP; i++) STR.count_strict('1');
console.timeEnd('proto-strict');
结果:
proto: 101 ms
proto-strict: 7.5 ms
this[i] === char
的代码,并看看是否得到相同的结果吗? - Niet the Dark Absolthis[i] === char
进行了测试,结果相同。 - Christian Vincenzo Trainacount
函数时,必须将this
参数转换为字符串对象而不是字符串字面量,而在严格模式下,它不必这样做才能正常运行。为什么会这样我不太清楚,我非常想知道答案。 - Nick Larsenthis
始终是一个对象,但在严格模式下它会跳过这一步骤,因此你得到的是原始字符串或提供给this
的任何东西。 - user1106925"use strict";
了,伙计们!嘿! - Jonathan