Berikut pertanyaan Memperluas kinerja String.prototype saya benar-benar tertarik, karena hanya menambahkan "use strict"
ke String.prototype
kinerja 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
javascript
performance
exebook
sumber
sumber
this[i] === char
dan melihat apakah Anda mendapatkan perbedaan yang sama?this[i] === char
di lingkungan DOM dan hasilnya samacount
fungsi,this
parameter 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 ituthis
."use strict";
mana - mana anak laki-laki! GooooldJawaban:
Dalam mode ketat,
this
konteksnya tidak dipaksa menjadi objek. Jika Anda memanggil suatu fungsi pada non-objek,this
hanya akan non-objek itu.Sebaliknya, dalam mode non-ketat,
this
konteksnya selalu dibungkus pertama dalam objek jika belum menjadi objek. Misalnya,(42).toString()
membungkus pertama42
dalamNumber
objek dan kemudian memanggilNumber.prototype.toString
denganNumber
objek sebagaithis
konteks. Dalam mode ketat,this
konteksnya tidak tersentuh dan hanya memanggilNumber.prototype.toString
dengan42
sebagaithis
konteks.Dalam kasus Anda, versi mode non-ketat menghabiskan banyak waktu membungkus dan membuka bungkus primitif
string
ke dalamString
pembungkus objek dan kembali. Versi mode ketat di sisi lain langsung bekerja pada primitifstring
, yang meningkatkan kinerja.sumber
with
juga membantu sedikit untuk setiap pencarian variabel iirc.with
membantu karena memungkinkan browser untuk alasan ekspresi variabel mana yang merujuk ke variabel mana.this
lebih "ketat" daripada selalu-objekthis
.this
adalahnull
atauundefined
, yang akan menjadi obyek global dalam mode ceroboh.this
" vs. "bungkusthis
" jika Anda mau. Pembungkus objek adalah kludge yang seharusnya tidak pernah ada, jadi masuk akal bahwa mode ketat akan menghindarinya lebih banyak bila memungkinkan.