Siguiendo la pregunta Extendiendo String.prototype performance Estoy realmente intrigado, porque solo agregar "use strict"
a un String.prototype
mé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] === char
y ver si obtienes la misma diferencia?this[i] === char
en un entorno de DOM y el resultado es el mismocount
función, elthis
pará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
this
contexto no está obligado a ser un objeto. Si llama a una función en un no objeto,this
solo será ese no objeto.Por el contrario, en modo no estricto, el
this
contexto siempre se envuelve primero en un objeto si aún no es un objeto. Por ejemplo,(42).toString()
primero se envuelve42
en unNumber
objeto y luego se llamaNumber.prototype.toString
con elNumber
objeto comothis
contexto. En modo estricto, elthis
contexto se deja sin tocar las llamadas y sóloNumber.prototype.toString
con42
comothis
contexto.En su caso, la versión en modo no estricto pasa mucho tiempo envolviendo y desenvolviendo mensajes primitivos
string
enString
envoltorios de objetos y viceversa. La versión en modo estricto, por otro lado, trabaja directamente en la primitivastring
, lo que mejora el rendimiento.fuente
with
también ayuda un poco para cada búsqueda variable de iirc.with
ayuda es inmensa, ya que permite al navegador razonar qué expresión variable se refiere a qué variable.this
es "más estricto" que siempre objetothis
.this
esnull
oundefined
, 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.