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基本方法