转化为字符串的规则
许多内置操作首先将它们的参数转换为字符串(这就是为什么 String 对象的行为类似于字符串原始值的原因)。这些操作可以总结为以下几点:
- 字符串按原样返回。
undefined转换成"undefined"。null转换成"null"。true转换成"true";false转换成"false"。- 数字使用与
toString(10)相同的算法转换。 - BigInt 使用与
toString(10)相同的算法转换。 - Symbol 抛出 TypeError。
- 对于对象,首先,通过依次调用其
[Symbol.toPrimitive]()(hint为"string")、toString()和valueOf()方法将其转换为原始值。然后将生成的原始值转换为一个字符串。
转化为字符串的操作
有几种方法可以在 JavaScript 中实现几乎相同的效果。
- 模板字符串:
`${x}`为嵌入的表达式执行上面的字符串强制转换步骤。 String()函数:String(x)使用相同的算法去转换x,只是 Symbol 不会抛出 TypeError,而是返回"Symbol(description)",其中description是对 Symbol 的描述。- 使用
+运算符:"" + x将其操作数强制转为原始值,而不是字符串,并且对于某些对象,其行为与普通字符串强制转换完全不同。
根据情况,推荐使用 `${x}`(模拟内置行为)或 String(x)(处理 symbol 值而不抛出错误),但不推荐使用 "" + x。