Ответ 1
Многие используют резервные реализации MDC (например, для indexOf). Они, как правило, строго соответствуют стандартам, даже если они явно проверяют типы всех аргументов.
К сожалению, пока понятно, что авторы рассматривают этот код как тривиальный и свободно используемый, похоже, нет явного разрешения на предоставление лицензий, чтобы записать это в письменной форме. Вики в целом является CC Attribution-ShareAlike, если это приемлемая лицензия (хотя CC не предназначен для кода как такового).
js-методы выглядят нормально вообще, но не соответствуют стандартам по краям того, как должны функционировать функции (например, undefined элементы списка, функции, которые мутируют список). Он также полон других случайных нестандартных методов, включая некоторые сомнительные, такие как изворотливые stripTags и неполный кодек UTF-8 (что также немного не нужно, учитывая трюк unescape(encodeURIComponent)
).
Для чего это стоит, здесь то, что я использую (которое я тем самым выпускаю в общественное достояние, если можно сказать, что оно полностью защищено авторскими правами). Это немного короче, чем версии MDC, так как он не пытается набирать текст, чтобы вы не делали что-то глупое, как пропускать неработающие обратные вызовы или нецелые индексы, но кроме этого он пытается соответствовать стандартам. (Дайте мне знать, если я пропустил что-нибудь. -))
'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;
};
}
Другие методы ECMA262-5, не реализованные здесь, включают Array reduce
/reduceRight
, JSON и несколько новых методов Object
, которые могут быть надежно реализованы как функции JS.