Banyak yang menggunakan implementasi fallback MDC (mis. Untuk indexOf ). Mereka umumnya sangat sesuai dengan standar, bahkan sejauh secara eksplisit memeriksa jenis dari semua argumen.
Sayangnya meskipun jelas bahwa penulis menganggap kode ini sepele dan dapat digunakan secara bebas, tampaknya tidak ada pemberian lisensi eksplisit untuk menuliskannya. Wiki secara keseluruhan adalah CC Attribution-ShareAlike, jika itu adalah lisensi yang dapat diterima (meskipun CC tidak dirancang untuk kode seperti itu).
js-methods terlihat OK secara umum, tetapi tidak sesuai dengan standar di sekitar tepi bagaimana fungsi seharusnya (mis. item daftar yang tidak ditentukan, fungsi yang mengubah daftar). Ini juga penuh dengan metode non-standar acak lainnya, termasuk beberapa yang dipertanyakan seperti stripTag yang cerdik dan codec UTF-8 yang tidak lengkap (yang juga sedikit tidak perlu mengingat unescape(encodeURIComponent)
triknya).
Untuk apa nilainya, inilah yang saya gunakan (yang dengan ini saya rilis ke domain publik, jika dapat dikatakan memiliki hak cipta sama sekali). Ini sedikit lebih pendek daripada versi MDC karena tidak mencoba mengetik-sniff bahwa Anda belum melakukan sesuatu yang konyol seperti meneruskan panggilan balik non-fungsi atau indeks non-integer, tetapi selain itu mencoba untuk memenuhi standar. (Beri tahu saya jika saya melewatkan sesuatu. ;-))
'use strict';
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)));
};
}
};
}
if (!('trim' in String.prototype)) {
String.prototype.trim= function() {
return this.replace(/^\s+/, '').replace(/\s+$/, '');
};
}
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;)
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;
};
}
Metode ECMA262-5 lain yang tidak diimplementasikan di sini termasuk Array reduce
/ reduceRight
, yang JSON dan beberapa Object
metode baru yang dapat diimplementasikan dengan andal sebagai fungsi JS.