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.
Dê uma olhada no Underscore.js .
fonte
Kris Kowal compilou uma pequena biblioteca que funciona como um calço para as funções do ECMAScript 5 que podem estar ausentes na implementação do navegador. Algumas das funções foram revisadas várias vezes por outras pessoas para serem otimizadas quanto à velocidade e contornar os erros do navegador. As funções são escritas para seguir a especificação o mais próximo possível.
O es5-shim.js foi lançado sob a licença MIT, as extensões Array.prototype estão próximas da parte superior e você pode cortar e remover todas as funções desnecessárias com facilidade. Sugiro também que você reduza o script, pois os comentários o tornam muito maior do que precisa.
fonte
Por 'não implementar funções-chave', você realmente quer dizer 'está em conformidade com a ECMA 262 3ª edição', certo? :)
Os métodos aos quais você está se referindo fazem parte da nova quinta edição - para navegadores que não suportam isso, você pode usar o seguinte 'shim' que se estende de 3º para 5º http://github.com/kriskowal/narwhal- lib / blob / lib-narwhal / lib / global-es5.js .
fonte
Esses scripts não funcionam bem nos meus testes. Crio um arquivo com as mesmas funções com base nos documentos MDN .
Muitas áreas de problemas são resolvidas no Internet Explorer 8. Consulte o código em egermano / ie-fix.js .
fonte
Com o Underscore.js
var arr=['a','a1','b'] _.filter(arr, function(a){ return a.indexOf('a') > -1; })
fonte