Nhiều người sử dụng các triển khai dự phòng MDC (ví dụ: cho indexOf ). Nhìn chung, chúng tuân thủ nghiêm ngặt các tiêu chuẩn, thậm chí đến mức kiểm tra rõ ràng các loại của tất cả các đối số.
Thật không may, trong khi rõ ràng rằng các tác giả coi mã này là tầm thường và có thể sử dụng tự do, dường như không có một giấy phép rõ ràng nào để đưa văn bản này vào văn bản. Toàn bộ wiki là CC Attribution-ShareAlike, nếu đó là giấy phép có thể chấp nhận (mặc dù CC không được thiết kế cho mã như vậy).
Các phương thức js nhìn chung có vẻ ổn, nhưng không tuân thủ các tiêu chuẩn xung quanh các cạnh của cách các chức năng được cho là (ví dụ: các mục danh sách không xác định, các hàm làm thay đổi danh sách). Nó cũng có đầy đủ các phương thức phi tiêu chuẩn ngẫu nhiên khác, bao gồm một số phương pháp nghi vấn như dải phân cách khéo léo và bộ giải mã UTF-8 không hoàn chỉnh (cũng không cần thiết một chút cho unescape(encodeURIComponent)
thủ thuật này).
Đối với những gì nó có giá trị, đây là những gì tôi sử dụng (mà tôi sẽ phát hành vào phạm vi công cộng, nếu nó có thể được coi là có bản quyền). Nó ngắn hơn một chút so với các phiên bản MDC vì nó không cố gắng đánh hơi rằng bạn đã làm điều gì đó ngớ ngẩn như vượt qua các cuộc gọi lại không có chức năng hoặc các chỉ mục không nguyên, nhưng ngoài việc nó cố gắng tuân thủ các tiêu chuẩn. (Hãy cho tôi biết nếu tôi bỏ lỡ bất cứ điều gì.;))
'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;
};
}
Các phương thức ECMA262-5 khác không được triển khai ở đây bao gồm Array reduce
/ reduceRight
, các phương thức JSON và một vài Object
phương thức mới có thể được triển khai một cách đáng tin cậy như các hàm JS.