Berikut pertanyaan Memperluas kinerja String.prototype saya benar-benar tertarik, karena hanya menambahkan "use strict"ke String.prototypekinerja metode ditingkatkan 10 kali. The penjelasan oleh bergi pendek dan tidak menjelaskan kepada saya. Mengapa ada perbedaan dramatis antara dua metode yang hampir identik, yang hanya berbeda di "use strict"atas? Bisakah Anda menjelaskan lebih detail dan dengan teori di balik ini?
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');
Hasil:
proto: 101 ms
proto-strict: 7.5 ms
this[i] === chardi lingkungan DOM dan hasilnya sama
countfungsi, thisparameter harus dilemparkan ke objek string bukan string literal sedangkan dalam mode ketat tidak harus untuk beroperasi dengan benar. Mengapa hal ini terjadi di luar jangkauan saya, saya sangat tertarik dengan jawabannya.
this, tetapi dalam mode ketat itu melompati langkah itu, sehingga Anda mendapatkan string primitif , atau apa pun yang disediakan untuk itu this.
"use strict";mana - mana anak laki-laki! Goooold
this[i] === chardan melihat apakah Anda mendapatkan perbedaan yang sama?