Ruby's Louvre

每天学习一点点算法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

javascript 超级字符串对象

基于不对原生对象进行扩展的原则,搞了这个方便的处理字符串的对象。

下面是第一类工厂,相当于mootools的Native方法。

类工厂的能力很强大,生成的类拥有自我扩展的能力。下面是超级字符串的核心方法,分别为入口函数,构造函数,toString,valueOf与一个重要的setArray方法,用于设置charAt的索引值与length属性。

var string = dom.factory({
  init: function (obj) {
    this.setArray(obj[0].split(''));
    return this;
  },
  toString: function () {
    return this.valueOf();
  },
  valueOf: function () {
    return Array.prototype.join.call(this, '');
  },
  setArray: dom.setArray
});

再把字符串的泛化方法加持到其上,让其伪装成字符串对象。

//为超级字符串对象添加原生字符串对象的泛化方法
dom.each("charAt,charCodeAt,concat,indexOf,lastIndexOf,match,\
        replace,search,slice,split,substr,substring,toLowerCase,\
        toUpperCase,fontcolor,big,small,anchor,link,bold,italics,\
        sub,sup,fixed,fontsize,strike".match(/\w+/g),
function (name) {
  string.fn[name] = function () {
    var method = String.prototype[name],
    args = dom.toArray(arguments),
    ret = method.apply(this.valueOf(), args);
    if (dom.isString(ret))
      return string(ret)
    return ret;
  }
});

全局变量window也有许多专门处理字符串的方法,我们也把它们加持到超级字符串对象上。

//为超级字符串对象添加全局对象处理字符串的相关方法
dom.each("parseInt,parseFloat,escape,unescape,eval,decodeURI,\
        encodeURI,decodeURIComponent,encodeURIComponent".match(/\w+/g),
function (name) {
  string.fn[name] = function () {
    var ret = dom.win[name](this.valueOf());
    if (dom.isString(ret)) //确保返回超级字符串对象
      return string(ret);
    return ret;
  }
});

再添加一些有用的自定义方法:

string.mixin({
  trim: function () {
    var str = this.valueOf();
    if (String.trim) {
      return string(String.trim(str))
    } else {
      str = str.replace(/^\s\s*/, '');
      var ws = /\s/,
      i = str.length;
      while (ws.test(str.charAt(--i)));
      return string(str.slice(0, i + 1));
    };
  },
  dasherize: function () {
    return this.replace(/_/g, '-');
  },
  camelize : function (str) {
    return this.replace(/-([a-z])/g, function($1,$2){
      return $2.toUpperCase()
    });
  },
  capitalize: function () {
    return this.replace(/\S+/g, function ($1) {
      return $1.charAt(0).toUpperCase() + $1.slice(1);
    });
  },
  contains: function (segment) {
    return this.indexOf(segment) !== -1;
  },
  startsWith: function (pattern) {
    return this.indexOf(pattern) === 0;
  },
  endsWith: function (pattern) {
    var d = this.length - pattern.length;
    return d >= 0 && this.lastIndexOf(pattern) === d;
  },
  empty: function () {
    return this.valueOf() === '';
  },
  blank: function () {
    return /^\s*$/.test(this.valueOf());
  },
  times: function (n) {
    if (n == 1)
      return this;
    var s = this.times(Math.floor(n / 2));
    s += s;
    if (n % 2) {
      s += this;
    }
    return string(s);
  }
});
//静态化超级字符串对象的大部分原型方法
string.staticizeWithout(["setArray"]);
dom.string = string;

像字符串原有的方法与window处理字符串的相关方法就不废话了,我们看一下自定义方法的用法。

超级字符串对象
trim 去除左右两边的空白
contains 检测string是否包含给定的子串
dasherize 将字符串中的"_"代替成"-"
camelize 将字符串改成驼峰风格
capitalize 首字符大写
startsWith 检测string以给定的子串开头
endsWith 检测string以给定的子串结束
empty 检测string是否一个字符也没有
blank 检测string是否全部由空白字符构成
times 字符串乘法,传入一个数字,作为原字符串的倍数

相关链接:超级数组对象

如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码

posted on   司徒正美  阅读(2725)  评论(4编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示