Багато хто використовує резервні реалізації MDC (наприклад, для indexOf ). Вони, як правило, суворо відповідають стандартам, навіть настільки чітко перевіряючи типи всіх аргументів.
На жаль, хоча очевидно, що автори вважають цей код тривіальним і вільним у використанні, але, мабуть, не існує явного дозволу на надання ліцензії на письмовій формі. Вікі в цілому є CC Attribution-ShareAlike, якщо це прийнятна ліцензія (хоча CC не розроблений для коду як такого).
js-методи загалом виглядають нормально, але вони не є наближеними до стандартів по краях того, як мають бути функції (наприклад, невизначені елементи списку, функції, що мутують список). Також багато інших випадкових нестандартних методів, включаючи деякі сумнівні, такі як хитрі стриптиз-теги та неповний кодек 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, не реалізовані тут, включають масив reduce
/ reduceRight
, JSON та кілька нових Object
методів, які можна надійно реалізувати як функції JS.