什么是扩展内置对象的有用 JavaScript 方法?

IT技术 javascript
2021-02-20 23:11:54

扩展内置 JavaScript 对象(如 String、Array、Date、Boolean、Math 等)的最有用、最实用的方法是什么?

string

大批

日期

注意:请为每个答案发布一种扩展方法。

6个回答

字符串全部替换:

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
这是一个很好的增强,但为了使它更好,您可以在函数定义中添加两个参数并使用它们代替参数数组。这会将代码缩短为两行。如果您的函数不需要接受任意数量的参数,我个人认为使用参数数组没有任何意义。
2021-04-17 23:11:54
事实上,如果你用它替换单词,这可能无法正常工作。那么也许更好的解决方案是检查搜索参数是什么类型。如果它是一个字符串,那么您可以转义所有特殊字符,如果它是一个正则表达式(typeof 是对象),那么您可以直接使用它。
2021-04-27 23:11:54
@RaYell - 如果您想一次替换多个字符,这将不起作用,例如'foobar'.replaceAll('foo'). 我认为最好明确表示接受正则表达式作为第一个参数。
2021-04-29 23:11:54
这是一个很棒的捕捉伙伴。你应该开始编辑这些帖子!:)
2021-05-05 23:11:54
另一个改进:如果您添加任何正则表达式特殊字符,您可能会得到意想不到的结果。即如果你通过'.' 作为搜索字符串,您将替换所有字符。为避免这种情况,请将您的正则表达式更改为 new RegExp('[' + search ']')
2021-05-10 23:11:54

这是String.replaceAll()方法的另一种实现

String.prototype.replaceAll = function(search, replace) {
    if (replace === undefined) {
        return this.toString();
    }
    return this.split(search).join(replace);
}

这个和这里发布的解决方案之间的区别在于这个实现正确处理字符串中的正则表达式特殊字符以及允许单词匹配

为什么你需要做 .toString?如果未定义替换,则将原始对象分配回自身。例如字符串测试 = "你好"; test = test.replace("你好");
2021-04-19 23:11:54
如果我删除 toString() 并运行它,我将得到一个对象而不是字符串。尝试对返回值使用 typeof(在 FF & Firebug 中测试,不知道其他浏览器是否以不同方式处理)。
2021-04-30 23:11:54
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
RaYell 更新了代码,如果 indexOf 已经存在,则不会重新定义它。
2021-05-02 23:11:54
这个方法在大多数浏览器中实现,所以你可以在覆盖已经完成的事情之前添加一个存在检查。IMO 你应该把这段代码包装在 if (Array.prototype.indexOf === undefined) {...}
2021-05-05 23:11:54

James Padolsey 提供了大量的 String.prototype 函数

https://github.com/padolsey/string.prototype

这些包括:

  • 骆驼化
  • 包含
  • 数数
  • 提炼
  • 为每个
  • 每个词
  • 联动
  • 许多
  • 随机化
  • 消除
  • 撤销
  • 缩短
  • 种类
  • 到DOM
  • 修剪
@ P6345uk 有点晚了,但修复了链接。
2021-04-23 23:11:54

字符串格式

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
你是对的 Nosredna,修复了帖子。
2021-04-16 23:11:54
我认为微软的 ASP.NET Ajax 库有 string.Format 模仿 C# 的 string.Format 方法。
2021-04-24 23:11:54
这是一个很好的。如果它被扩展为模仿 C#,你可以为日期/数字/对象指定上下文敏感的格式,例如。String.Format("{0:d}", val)
2021-05-11 23:11:54