Muitos usam as implementações de fallback do MDC (por exemplo, para indexOf ). Geralmente, eles são rigorosamente compatíveis com os padrões, mesmo na verificação explícita dos tipos de todos os argumentos.
Infelizmente, embora esteja claro que os autores consideram esse código trivial e livremente utilizável, não parece haver uma concessão explícita de licença para colocar isso por escrito. O wiki como um todo é CC Attribution-ShareAlike, se for uma licença aceitável (embora o CC não tenha sido projetado para código como tal).
js-methods parece bem em geral, mas não é tão compatível com os padrões nas bordas de como as funções devem ser (por exemplo, itens de lista indefinidos, funções que modificam a lista). Também está cheio de outros métodos não padronizados aleatórios, incluindo alguns questionáveis, como o desagradável stripTags e o codec UTF-8 incompleto (que também é um pouco desnecessário, dado o unescape(encodeURIComponent)
truque).
Pelo que vale a pena, aqui está o que eu uso (que por meio deste, libero para o domínio público, se é que se pode dizer que é de propriedade do autor). É um pouco menor do que as versões do MDC, pois não tenta detectar que você não fez algo bobo como passar retornos de chamada sem função ou índices não inteiros, mas, além disso, ele tenta ser compatível com os padrões. (Deixe-me saber se eu perdi alguma coisa. ;-))
'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;
};
}
Outros métodos ECMA262-5 não implementados aqui incluem Matriz reduce
/ reduceRight
, os Object
métodos JSON e os poucos métodos novos que podem ser implementados de forma confiável como funções JS.