Acerca de Scriptia
Scriptia forma parte del PDM de Choan C. Gálvez, desarrollador web residente en Barcelona. Scriptia pretende mejorar la calidad de la documentación acerca de javascript disponible en español.
Saltar a Anotaciones relacionadas
Un mensaje de Carlos Campderrós en javaEScript, la lista de correo, me descubre un bug una peculiaridad de JScript (la implementación de ECMAScript que padecemos en Internet Explorer) con el cual no recuerdo haberme enfrentado. En pocas palabras: el método substr no da los resultados esperados cuanto se utiliza un valor negativo como primer parámetro.
Según la especificación, substr toma dos parámetros, start y length,. Si start es un valor negativo, es tratado como sourceLength + start, siendo sourceLength la longitud de la cadena sobre la que se aplica el método.
Ojo: String.prototype.substr se define en el anexo B de la especificación, sin carácter normativo y sin hacer este método parte del estándar.
Así:
"test".substr(-1);
Debería devolver el valor "t". Explorer –versión 7 incluida- devuelve "test" (la cadena completa) y se queda tan ancho.
Opción uno: usar el siguiente workaround cuando sea menester:
var s = "test";
// antes (como debería ser siempre)
var sub = s.substr(-1);
// después (para que IE trague)
sub = s.substr(s.length - 1);
Opción dos: implementar un parche allí donde haga falta y usar substr sin preocupación alguna:
Lo haremos detectando el error –en lugar de el navegador o su versión– y usando una función anónima para restringir el ámbito de las variables que declaremos. Tal que así.
(function() {
if ("test".substr(-1) == "test") {
var substr = String.prototype.substr;
String.prototype.substr = function(s) {
if (s < 0) s = this.length + s;
return substr.apply(this, arguments);
}
}
})();
Para el saco de los fixes habituales.
Scriptia forma parte del PDM de Choan C. Gálvez, desarrollador web residente en Barcelona. Scriptia pretende mejorar la calidad de la documentación acerca de javascript disponible en español.