【问题标题】:What are useful JavaScript methods that extends built-in objects? [closed]有哪些有用的 JavaScript 方法可以扩展内置对象? [关闭]
【发布时间】:2010-11-11 08:48:51
【问题描述】:

在扩展内置 JavaScript 对象(如字符串、数组、日期、布尔值、数学等)时,您最有用、最实用的方法是什么?

字符串

数组

日期

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

【问题讨论】:

标签: javascript


【解决方案1】:

字符串全部替换:

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

【讨论】:

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

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

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

此解决方案与 here 发布的解决方案之间的区别在于,此实现正确处理字符串中的正则表达式特殊字符并允许单词匹配

【讨论】:

  • 为什么需要做.toString?如果替换未定义,则您将原始对象分配回自身。例如字符串测试=“你好”; test = test.replace("你好");
  • 如果我删除 toString() 并运行它,我将得到一个对象而不是字符串。尝试在返回值上使用 typeof(在 FF 和 Firebug 中测试,不知道其他浏览器是否以不同的方式处理)。
【解决方案3】:
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

【讨论】:

  • 这个方法在大多数浏览器中都实现了,所以你可以在覆盖已经完成的事情之前添加一个存在检查。 IMO,您应该将此代码包装在 if (Array.prototype.indexOf === undefined) {...}
  • RaYell,更新了代码,如果 indexOf 已经存在,则不再重新定义它。
【解决方案4】:

James Padolsey 有大量的 String.prototype 函数

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

这些包括:

  • 骆驼化
  • 包含
  • 计数
  • 附上
  • 提取
  • 为每个
  • forEachWord
  • 链接化
  • 很多
  • 随机化
  • 移除
  • 反向
  • 缩短
  • 排序
  • 到DOM
  • 修剪
  • 换行

【讨论】:

  • @P6345uk 有点晚了,但修复了链接。
【解决方案5】:

字符串格式

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

【讨论】:

  • 这很好。如果它被扩展为模仿 C# ,您可以为日期/数字/对象指定上下文敏感格式,例如,那将是非常酷的。 String.Format("{0:d}", val)
  • 我认为微软的 ASP.NET Ajax 库有 string.Format 模仿 C# 的 string.Format 方法。
  • 你是对的 Nosredna,修复了帖子。
【解决方案6】:
// 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();
}

【讨论】:

    【解决方案7】:

    字符串填充:

    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  '
    

    【讨论】:

      【解决方案8】:

      PHP.JS 是将 PHP 的大部分函数移植到 JavaScript 的一个非常好的尝试。他们目前有一个非常令人印象深刻的名单:

      在线:http://phpjs.org/functions/index

      【讨论】:

        【解决方案9】:

        Function.prototype.bind 来自 Prototype 库。

        类似于callapply,但允许您返回对在特定上下文中调用的函数的引用,而不是立即执行它。还允许您对参数进行柯里化。它非常有用,以至于它成为 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);
          }
        }
        

        【讨论】:

          【解决方案10】:

          各种列表操作原型总是很棒。由于每个帖子只需要一个,我将只发布 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 方法无法返回真正的数组,这使得这些方法中的很多都变得毫无用处。如果您使用某种 Lib,它们通常已经定义了类似的方法(map、filter、exists 等)。

          【讨论】:

            【解决方案11】:

            Date.toMidnight

            Date.prototype.toMidnight = function(){ 
              this.setMinutes(0); 
              this.setSeconds(0); 
              this.setHours(0) 
            }
            

            【讨论】:

            • 名字不好,因为它修改了日期对象,而不是像其他 toX 方法一样返回不同的值。
            【解决方案12】:

            这是 Date 对象的一个​​很好的扩展,它允许您非常轻松地格式化日期。它使用 PHP 的日期语法,因此熟悉 PHP 的人很快就会掌握它。其他人在网站上也有大量可能的开关列表。就个人而言,我还没有找到更简单的方法将日期格式化为各种格式。

            Date Format

            【讨论】:

              【解决方案13】:

              我经常使用的函数集合可以在这里找到:

              http://svn.asplib.org/asplib1.2/core/string.asp

              http://docs.hyperweb.no/objects/String/

              【讨论】:

                【解决方案14】:

                我曾多次使用 Scott Koon 概述的 Array.Map 函数。

                http://www.lazycoder.com/weblog/2009/08/12/a-simple-map-function-for-plain-javascript-arrays/

                Array.prototype.map = function(fn) {
                    var r = [];
                    var l = this.length;
                    for(i=0;i<l;i++)
                    {
                        r.push(fn(this[i]));
                    }
                    return r; 
                };
                

                【讨论】:

                  【解决方案15】:

                  数组包含:

                  Array.prototype.contains = function(obj) {
                      for (var i=0; i < this.length; i++) {
                          if(this[i] === obj) return i;
                      }
                      return -1;
                  }
                  

                  用法:

                  var arr = [1, 2, 3];
                  alert(arr.contains(2));
                  

                  这个小辅助函数告诉你你的数组是否包含一个对象。如果是,则返回对象的索引,否则返回 -1。

                  周五下午的免费提示:永远不要修改对象原型。那只是要求整个世界的痛苦-我很难学到这一点:)

                  【讨论】:

                  • 这与上面发布的 Array.indexOf() 方法相同。我建议使用 indexOf,因为它已经在大多数浏览器中实现。
                  • 我认为在某些情况下修改对象原型是可以的——只要你不是在开发另一个 JavaScript 库,就是这样。这只是意味着您在迭代对象成员时必须小心(即使用 hasOwnProperty) - 当然,您可以向对象原型添加一个方法来为您处理迭代:)
                  【解决方案16】:

                  这两个是用于从数组中的特定位置插入和删除元素的包装器,因为我不喜欢 splice 这个名字。

                  // insert element at index
                  Array.prototype.insertAt = function(element, index) {
                      this.splice(index, 0, element);
                  }
                  
                  // delete element from index
                  Array.prototype.removeAt = function(index) {
                      this.splice(index, 1);
                  }
                  

                  一些更有用的数组方法可以避免使用索引:

                  Array.prototype.first = function() {
                      return this[0] || undefined;
                  };
                  
                  Array.prototype.last = function() {
                      if(this.length > 0) {
                          return this[this.length - 1];
                      }
                      return undefined;
                  };
                  
                  Array.prototype.max = function(array){
                      return Math.max.apply(Math, array);
                  };
                  
                  Array.prototype.min = function(array){
                      return Math.min.apply(Math, array);
                  };
                  

                  MooTools 库中的一些有用函数:

                  Function.delay

                  用于在给定的毫秒数过去后执行函数。

                  // alerts "hello" after 2 seconds.
                  (function() {
                      alert("hello");
                  }).delay(2000);    ​
                  

                  Number.times

                  类似于 Ruby 的数字时间方法,它接受一个函数并执行 N 次,其中 N 是数字值。

                  // logs hello 5 times
                  (5).times(function() {
                      console.log("hello");
                  });
                  

                  【讨论】:

                    【解决方案17】:

                    像这样使用原型链:

                    String.prototype.AddWorld = function() { return this+'World' }
                    
                    "Hello ".AddWorld(); // returns the string "Hello World"
                    

                    【讨论】:

                    • -1 因为它没有用或不实用。
                    • 这样会更有用String.prototype.appendWord=function(word){ this = this +" "+ word;}"Hello".appendWord("World");
                    【解决方案18】:
                    // This replaces all instances of 'from' to 'to' even when
                    // 'from' and 'to' are similar (i.e .replaceAll('a', 'a '))
                    String.prototype.replaceAll = function(from, to) {
                        var k = this;
                        var i = 0;
                        var j = from.length;
                        var l = to.length;
                    
                        while (i <= k.length)
                            if (k.substring(i, i + j) == from) {
                            k = k.substring(0, i) + k.substring(i).replace(from, to);
                            i += l;
                        }
                        else
                            i++;
                    
                        return k;
                    };
                    

                    【讨论】:

                    • 使用'g'(全局匹配)标志并进行常规替换更容易。 "abaababa".replace(/a/g, "c") =&gt; "cbccbcbc"
                    【解决方案19】:

                    http://maiaco.com/articles/js/missingArrayFunctions.php 上有一篇不错的文章,描述了添加到 Array 原型的六个有用函数。这些函数是 linearSearch(与另一个答案中给出的 indexOf 相同)、binarySearch、retainAll、removeAll、unique 和 addAll。本文还包括六个函数中每个函数的 JavaScript 代码以及展示如何使用它们的示例代码。

                    【讨论】:

                      【解决方案20】:

                      这是一个字符串大写的原型函数:

                      String.prototype.capitalize = function() {
                          return this.charAt(0).toUpperCase() + this.slice(1);
                      }
                      

                      【讨论】:

                        【解决方案21】:

                        使用 underscore.js 库之类的东西,或者对于 Angular 使用 lodash 库。

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2011-03-29
                          • 1970-01-01
                          • 1970-01-01
                          • 2010-10-04
                          • 2012-06-10
                          • 2020-09-22
                          • 1970-01-01
                          相关资源
                          最近更新 更多