После вопроса Расширение производительности String.prototype Я действительно заинтригован, потому что простое добавление "use strict" к String.prototype повысило производительность 10 раз. Объяснение от bergi является кратким и не объясняет мне его. Почему существует такая резкая разница между двумя почти идентичными методами, которые отличаются только "use strict" вверху? Не могли бы вы объяснить более подробно и теорию, лежащую в основе этого?

String.prototype.count = function (char) {
  var n = 0;
  для (var i = 0; i 

Результат:

proto: 101 ms
proto-strict: 7.5 ms

exebook

Ответов: 1

Ответы (1)

В строгом режиме контекст this не обязательно должен быть объектом. Если вы вызываете функцию на не-объекте, this просто будь этим не объектом.

Напротив, в нестрогом режиме контекст this всегда сначала оборачивается в объект, если он еще не является объектом. Например, (42) .toString () сначала переносит 42 в объект Number, а затем вызывает Number.prototype.toString с объект Number как this контекст. В строгом режиме контекст this остается нетронутым и просто вызывает Number.prototype.toString с 42 как this context.

(функция () {
  console.log (тип этого);
}). call (42); // 'объект'

(функция () {
  'использовать строго';
  console.log (тип этого);
}). call (42); // 'число'

В вашем случае версия нестрогого режима тратит много времени на упаковку и разворачивание примитива strings в String обертки объектов и обратно. С другой стороны, версия в строгом режиме напрямую работает с примитивом string, что улучшает производительность.

2022 WebDevInsider