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
this[i] === charen un entorno de DOM y el resultado es el mismo
countfunción, el thispará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! Goooold
this[i] === chary ver si obtienes la misma diferencia?