字符串的特点 ECMAScript 中的字符串是不可变的(immutable),意思是一旦创建,它们的值就不能变了。要修改 某个变量中的字符串值,必须先销毁原始的字符串,然后将包含新值的另一个字符串保存到该变量,如 下所示: let lang = “Java”; lang = lang + “Script”; 这里,变量lang 一开始包含字符串"Java"。紧接着,lang 被重新定义为包含"Java"和"Script" 的组合,也就是"JavaScript"。整个过程首先会分配一个足够容纳10 个字符的空间,然后填充上 “Java"和"Script”。最后销毁原始的字符串"Java"和字符串"Script",因为这两个字符串都没有用 了。所有处理都是在后台发生的,而这也是一些早期的浏览器(如Firefox 1.0 之前的版本和IE6.0)在 拼接字符串时非常慢的原因。这些浏览器在后来的版本中都有针对性地解决了这个问题。
转换为字符串 有两种方式把一个值转换为字符串。首先是使用几乎所有值都有的toString()方法。这个方法唯 一的用途就是返回当前值的字符串等价物。比如: let age = 11; let ageAsString = age.toString(); // 字符串"11" let found = true; let foundAsString = found.toString(); // 字符串"true" toString()方法可见于数值、布尔值、对象和字符串值。(没错,字符串值也有toString()方法, 该方法只是简单地返回自身的一个副本。)null 和undefined 值没有toString()方法。 多数情况下,toString()不接收任何参数。不过,在对数值调用这个方法时,toString()可以 40 第3 章 语言基础 接收一个底数参数,即以什么底数来输出数值的字符串表示。默认情况下,toString()返回数值的十 进制字符串表示。而通过传入参数,可以得到数值的二进制、八进制、十六进制,或者其他任何有效基 数的字符串表示,比如: let num = 10; console.log(num.toString()); // “10” console.log(num.toString(2)); // “1010” console.log(num.toString(8)); // “12” console.log(num.toString(10)); // “10” console.log(num.toString(16)); // “a” 这个例子展示了传入底数参数时,toString()输出的字符串值也会随之改变。数值10 可以输出为 任意数值格式。注意,默认情况下(不传参数)的输出与传入参数10 得到的结果相同。 如果你不确定一个值是不是null 或undefined,可以使用String()转型函数,它始终会返回表 示相应类型值的字符串。String()函数遵循如下规则。 如果值有toString()方法,则调用该方法(不传参数)并返回结果。 如果值是null,返回"null"。 如果值是undefined,返回"undefined"。 下面看几个例子: let value1 = 10; let value2 = true; let value3 = null; let value4; console.log(String(value1)); // “10” console.log(String(value2)); // “true” console.log(String(value3)); // “null” console.log(String(value4)); // “undefined” 这里展示了将4 个值转换为字符串的情况:一个数值、一个布尔值、一个null 和一个undefined。 数值和布尔值的转换结果与调用toString()相同。因为null 和undefined 没有toString()方法, 所以String()方法就直接返回了这两个值的字面量文本。 注意 用加号操作符给一个值加上一个空字符串""也可以将其转换为字符串(加号操作符 本章后面会介绍)。
模板字面量 ECMAScript 6 新增了使用模板字面量定义字符串的能力。与使用单引号或双引号不同,模板字面量 保留换行字符,可以跨行定义字符串: let myMultiLineString = ‘first line\nsecond line’; let myMultiLineTemplateLiteral = first line second line; console.log(myMultiLineString); // first line // second line" console.log(myMultiLineTemplateLiteral); // first line 3.4 数据类型 41 8 1 2 3 4 5 14 6 7 9 10 11 13 12 // second line console.log(myMultiLineString === myMultiLinetemplateLiteral); // true 顾名思义,模板字面量在定义模板时特别有用,比如下面这个HTML 模板: let pageHTML = `