Siguiendo la pregunta Extendiendo String.prototype performance Estoy realmente intrigado, porque solo agregar "use strict"a un String.prototypemétodo mejoró el rendimiento 10 veces. La explicación de bergi es breve y no me la explica. ¿Por qué hay una diferencia tan dramática entre dos métodos casi idénticos, que solo difieren en "use strict"la parte superior? ¿Puedes explicar con más detalle y con la teoría detrás de esto?
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');
Resultado:
proto: 101 ms
proto-strict: 7.5 ms
javascript
performance
exebook
fuente
fuente

this[i] === chary ver si obtienes la misma diferencia?this[i] === charen un entorno de DOM y el resultado es el mismocountfunción, elthisparámetro debe convertirse en un objeto de cadena en lugar de un literal de cadena, mientras que en modo estricto no es necesario para funcionar correctamente. Por qué este es el caso está más allá de mí, estoy muy interesado en la respuesta.this, pero en modo estricto omite ese paso, por lo que obtiene la cadena primitiva , o lo que sea que se proporcionóthis."use strict";todos lados muchachos! GooooldRespuestas:
En modo estricto, el
thiscontexto no está obligado a ser un objeto. Si llama a una función en un no objeto,thissolo será ese no objeto.Por el contrario, en modo no estricto, el
thiscontexto siempre se envuelve primero en un objeto si aún no es un objeto. Por ejemplo,(42).toString()primero se envuelve42en unNumberobjeto y luego se llamaNumber.prototype.toStringcon elNumberobjeto comothiscontexto. En modo estricto, elthiscontexto se deja sin tocar las llamadas y sóloNumber.prototype.toStringcon42comothiscontexto.En su caso, la versión en modo no estricto pasa mucho tiempo envolviendo y desenvolviendo mensajes primitivos
stringenStringenvoltorios de objetos y viceversa. La versión en modo estricto, por otro lado, trabaja directamente en la primitivastring, lo que mejora el rendimiento.fuente
withtambién ayuda un poco para cada búsqueda variable de iirc.withayuda es inmensa, ya que permite al navegador razonar qué expresión variable se refiere a qué variable.thises "más estricto" que siempre objetothis.thisesnulloundefined, que sería el objeto global en modo descuidado.this" versus "envoltoriothis" si lo desea. Los envoltorios de objetos son un error que nunca debería haber existido, por lo que tiene sentido que el modo estricto los evite más cuando sea posible.