2.8 字符串

字符串(string)在任何一门编程语言中都至关重要。字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的。字符串是由数字、字母、下画线组成的一串字符。它是TypeScript语言中表示文本的数据类型。

在TypeScript语言中,可以用半角的双引号或单引号来表示字符串值,并且二者可以相互嵌套使用。在动态语言中,用字符串来表示代码,并且可以动态执行,这个功能异常强大,但是也比较危险,可能会执行恶意代码,如代码2-78所示。

【代码2-78】 string eval方法示例:string_eval.ts

    01  let b = 12345.28;
    02  eval("let a = 2 ; console.log(a+b);");

2.8.1 构造函数

在TypeScript中,可以用new String()构造函数来定义一个String对象。它的值是string类型的。代码2-79演示了String构造函数的基本用法。11行中的语句是错误的,string是原始类型,而String是它的封装对象,二者不一样。

【代码2-79】 String构造函数示例:string_construct.ts

    01  let a = new String("dddd");
    02  console.log(a);
    03  let b = new String(222);
    04  console.log(b);
    05  let c = new String(true);
    06  console.log(c);
    07  console.log(c[0]);              //t
    08  let d = new String({});
    09  console.log();
    10  //'string' is a primitive, but 'String' is a wrapper object
    11  let str:string = new String("dddd");       //错误

2.8.2 prototype

String.prototype中内置了很多方法,这样就可以在任何一个string类型的变量上去直接调用String.prototype中的方法。在JavaScript中,prototype是实现面向对象的一个重要机制,可以动态地扩展属性和方法。

在TypeScript中,如果用代码2-80来扩展方法,编译器就会报错。

【代码2-80】 String.prototype扩展错误示例:string_prototype.ts

    01  // 错误
    02  String.prototype.padZero = function (this: string, length: number) {
    03      var s = this;
    04      while (s.length < length) {
    05        s = '0' + s;
    06      }
    07      return s;
    08  };

提示

TypeScript中的String.prototype不能直接添加新的属性和方法,这和JavaScript不一样。

如果需要动态地扩展String.prototype中的方法或属性,我们必须通过定义interface String来实现扩展,如代码2-81所示。

【代码2-81】 String.prototype扩展示例:string_prototype2.ts

    01  interface String {
    02      leadingChars(chars: string|number, length: number): string;
    03  }
    04  String.prototype.leadingChars = function (chars: string|number, length:
        number): string  {
    05      return (chars.toString().repeat(length) + this).substr(-length);
    06  };
    07  let a = "@";
    08  console.log(a.leadingChars("0", 8));         //0000000@

在代码2-81中,首先用接口interface String来声明一个方法leadingChars,这样就可以用String.prototype.leadingChars来具体实现其方法逻辑了。

2.8.3 字符串的方法

字符串的一个常用属性是length,可以输出字符的长度。在字符串中更多使用的是方法。这些方法可以更好地让我们操作字符串。表2.9列出了一组String对象的方法。

表2.9 String基本方法