Sau câu hỏi Mở rộng hiệu suất String.prototype tôi thực sự bị thu hút, bởi vì chỉ cần thêm "use strict"
vào một String.prototype
phương thức đã cải thiện hiệu suất 10 lần. Lời giải thích của bergi rất ngắn gọn và không giải thích cho tôi. Tại sao có sự khác biệt lớn như vậy giữa hai phương pháp gần như giống hệt nhau, chỉ khác nhau ở "use strict"
đầu? Bạn có thể giải thích chi tiết hơn và với lý thuyết đằng sau điều này?
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');
Kết quả:
proto: 101 ms
proto-strict: 7.5 ms
this[i] === char
trong môi trường DOM và kết quả là như nhau
count
hàm, this
tham số phải được truyền tới một đối tượng chuỗi thay vì chuỗi ký tự trong khi ở chế độ nghiêm ngặt, nó không phải hoạt động chính xác. Tại sao đây là trường hợp nằm ngoài tôi, tôi rất quan tâm đến câu trả lời.
this
, nhưng trong chế độ nghiêm ngặt, nó bỏ qua bước đó, do đó bạn có được chuỗi nguyên thủy hoặc bất cứ thứ gì được cung cấp cho this
.
"use strict";
con trai khắp nơi! Goooold
this[i] === char
và xem nếu bạn nhận được sự khác biệt tương tự?