Muchos usan las implementaciones de respaldo de MDC (por ejemplo, para indexOf ). Por lo general, cumplen rigurosamente con los estándares, incluso hasta el punto de verificar explícitamente los tipos de todos los argumentos.
Desafortunadamente, aunque está claro que los autores consideran que este código es trivial y de libre uso, no parece haber una concesión de licencia explícita para poner esto por escrito. El wiki en su conjunto es CC Attribution-ShareAlike, si es una licencia aceptable (aunque CC no está diseñado para el código como tal).
js-method se ve bien en general, pero no cumple con los estándares en torno a los límites de cómo se supone que deben ser las funciones (por ejemplo, elementos de lista no definidos, funciones que mutan la lista). También está lleno de otros métodos aleatorios no estándar, incluidos algunos cuestionables como las etiquetas de tiras poco fiables y el códec UTF-8 incompleto (que también es un poco innecesario dado elunescape(encodeURIComponent)
truco).
Para lo que vale, esto es lo que uso (que por la presente publico en el dominio público, si se puede decir que tiene derechos de autor). Es un poco más corto que las versiones de MDC, ya que no intenta detectar que no ha hecho algo tonto, como pasar devoluciones de llamada sin función o índices no enteros, pero aparte de eso, intenta cumplir con los estándares. (Avísame si me he perdido algo. ;-))
'use strict';
// Add ECMA262-5 method binding if not supported natively
//
if (!('bind' in Function.prototype)) {
Function.prototype.bind= function(owner) {
var that= this;
if (arguments.length<=1) {
return function() {
return that.apply(owner, arguments);
};
} else {
var args= Array.prototype.slice.call(arguments, 1);
return function() {
return that.apply(owner, arguments.length===0? args : args.concat(Array.prototype.slice.call(arguments)));
};
}
};
}
// Add ECMA262-5 string trim if not supported natively
//
if (!('trim' in String.prototype)) {
String.prototype.trim= function() {
return this.replace(/^\s+/, '').replace(/\s+$/, '');
};
}
// Add ECMA262-5 Array methods if not supported natively
//
if (!('indexOf' in Array.prototype)) {
Array.prototype.indexOf= function(find, i /*opt*/) {
if (i===undefined) i= 0;
if (i<0) i+= this.length;
if (i<0) i= 0;
for (var n= this.length; i<n; i++)
if (i in this && this[i]===find)
return i;
return -1;
};
}
if (!('lastIndexOf' in Array.prototype)) {
Array.prototype.lastIndexOf= function(find, i /*opt*/) {
if (i===undefined) i= this.length-1;
if (i<0) i+= this.length;
if (i>this.length-1) i= this.length-1;
for (i++; i-->0;) /* i++ because from-argument is sadly inclusive */
if (i in this && this[i]===find)
return i;
return -1;
};
}
if (!('forEach' in Array.prototype)) {
Array.prototype.forEach= function(action, that /*opt*/) {
for (var i= 0, n= this.length; i<n; i++)
if (i in this)
action.call(that, this[i], i, this);
};
}
if (!('map' in Array.prototype)) {
Array.prototype.map= function(mapper, that /*opt*/) {
var other= new Array(this.length);
for (var i= 0, n= this.length; i<n; i++)
if (i in this)
other[i]= mapper.call(that, this[i], i, this);
return other;
};
}
if (!('filter' in Array.prototype)) {
Array.prototype.filter= function(filter, that /*opt*/) {
var other= [], v;
for (var i=0, n= this.length; i<n; i++)
if (i in this && filter.call(that, v= this[i], i, this))
other.push(v);
return other;
};
}
if (!('every' in Array.prototype)) {
Array.prototype.every= function(tester, that /*opt*/) {
for (var i= 0, n= this.length; i<n; i++)
if (i in this && !tester.call(that, this[i], i, this))
return false;
return true;
};
}
if (!('some' in Array.prototype)) {
Array.prototype.some= function(tester, that /*opt*/) {
for (var i= 0, n= this.length; i<n; i++)
if (i in this && tester.call(that, this[i], i, this))
return true;
return false;
};
}
Otros métodos ECMA262-5 no implementados aquí incluyen Array reduce
/ reduceRight
, los JSON y los pocos Object
métodos nuevos que pueden implementarse de manera confiable como funciones JS.
Echa un vistazo a Underscore.js .
fuente
Kris Kowal ha compilado una pequeña biblioteca que actúa como un calce para las funciones de ECMAScript 5 que pueden faltar en la implementación del navegador. Algunas de las funciones han sido revisadas en numerosas ocasiones por otras personas para optimizar la velocidad y evitar errores del navegador. Las funciones están escritas para seguir la especificación lo más cerca posible.
es5-shim.js se lanzó bajo la licencia MIT, las extensiones del prototipo Array están cerca de la parte superior y puede cortar y eliminar cualquier función que no necesite con bastante facilidad. También le sugiero que minimice el script ya que los comentarios lo hacen mucho más grande de lo que debe ser.
fuente
Por 'no implementar funciones clave' realmente quiere decir 'se ajusta al ECMA 262 3'rd ed' ¿verdad? :)
Los métodos a los que se refiere son parte de la nueva quinta edición: para los navegadores que no lo admiten, puede usar la siguiente 'cuña' que se extiende de la tercera a la quinta http://github.com/kriskowal/narwhal- lib / blob / narwhal-lib / lib / global-es5.js .
fuente
Esas secuencias de comandos no funcionan bien en mis pruebas. Creo un archivo con las mismas funciones basado en MDN documentos .
Se resuelven demasiadas áreas de problemas en Internet Explorer 8. Consulte el código en egermano / ie-fix.js .
fuente
Con el Underscore.js
var arr=['a','a1','b'] _.filter(arr, function(a){ return a.indexOf('a') > -1; })
fuente