你最有用、最实用的方法是什么,可以扩展内置的JavaScript对象,如String、Array、Date、Boolean、Math等?
String
Array
Date
注:请每个问题只提交一个扩展方法。
你最有用、最实用的方法是什么,可以扩展内置的JavaScript对象,如String、Array、Date、Boolean、Math等?
String
Array
Date
注:请每个问题只提交一个扩展方法。
字符串替换全部:
String.prototype.replaceAll = function(search, replace)
{
//if replace is not sent, return original string otherwise it will
//replace search string with 'undefined'.
if (replace === undefined) {
return this.toString();
}
return this.replace(new RegExp('[' + search + ']', 'g'), replace);
};
var str = 'ABCADRAE';
alert(str.replaceAll('A','X')); // output : XBCXDRXE
'foobar'.replaceAll('foo')
,那么这种方法是行不通的。我认为最好明确指出正则表达式可以作为第一个参数。 - harto这是另一种实现 String.replaceAll()
方法的方式
String.prototype.replaceAll = function(search, replace) {
if (replace === undefined) {
return this.toString();
}
return this.split(search).join(replace);
}
这个实现与这里发布的解决方案的区别在于,它正确处理字符串中的正则表达式特殊字符,并允许单词匹配。Array.prototype.indexOf = Array.prototype.indexOf || function (item) {
for (var i=0; i < this.length; i++) {
if(this[i] === item) return i;
}
return -1;
};
使用方法:
var list = ["my", "array", "contents"];
alert(list.indexOf("contents")); // outputs 2
有大量的String.prototype函数来自James Padolsey
https://github.com/padolsey/string.prototype
这些包括:
String.prototype.format = function (values) {
var regex = /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g;
var getValue = function (key) {
if (values == null || typeof values === 'undefined') return null;
var value = values[key];
var type = typeof value;
return type === 'string' || type === 'number' ? value : null;
};
return this.replace(regex, function (match) {
//match will look like {sample-match}
//key will be 'sample-match';
var key = match.substr(1, match.length - 2);
var value = getValue(key);
return value != null ? value : match;
});
};
使用方法:
alert('Program: {key1} {key2}'.format({ 'key1' : 'Hello', 'key2' : 'World' })); //alerts Program: hello world
// left trim
String.prototype.ltrim = function () {
return this.replace(/^\s+/, '');
}
// right trim
String.prototype.rtrim = function () {
return this.replace(/\s+$/, '');
}
// left and right trim
String.prototype.trim = function () {
return this.ltrim().rtrim();
}
字符串填充:
String.prototype.padLeft = function (length, character) {
return new Array(length - this.length + 1).join(character || ' ') + this;
}
'trial'.padLeft(7, 'X'); // output : 'XXtrial'
'trial'.padLeft(7); // output : ' trial'
String.prototype.padRight = function (length, character) {
return this + new Array(length - this.length + 1).join(character || ' ');
}
'trial'.padRight(7, 'X'); // output : 'trialXX'
'trial'.padRight(7); // output : 'trial '
Function.prototype.bind是原型库中的一个方法。
与call
和apply
类似,但允许您返回对函数的引用,在特定上下文中调用它而不立即执行它。还允许你柯里化参数。它非常有用,以至于它成为ECMAScript 5的一部分,并已在浏览器中本地实现。
Function.prototype.bind = function() {
var __method = this, args = Array.prototype.slice.call(arguments), object = args.shift();
return function() {
var local_args = args.concat(Array.prototype.slice.call(arguments));
if (this !== window) local_args.push(this);
return __method.apply(object, local_args);
}
}
PHP.JS是将PHP大部分函数移植到JavaScript的非常好的尝试。他们目前拥有一个非常令人印象深刻的列表:
各种列表操作的原型总是很棒。由于每个帖子只需要一个,我将仅发布foldl
,我通过SML发现它(它从左到右“折叠”列表,在foldr
中有一个相对应的版本)。
Array.prototype.foldl = function(fnc,start) {
var a = start;
for (var i = 0; i < this.length; i++) {
a = fnc(this[i],a);
}
return a;
}
var l = ["hello" , "world"];
l.foldl(function(i, acc) { return acc+" "+i; }, "") // => returns "hello world"
遗憾的是,标准DOM方法未能返回真正的数组,这使得许多这样的方法变得相当无用。如果您正在使用某种库,则它们通常已经定义了这些方法(map、filter、exists等)。