【JavaScript】其他值到字符串的转换规则

在 JavaScript 中,不同类型的值可以通过显式或隐式的方式转换为字符串。本文将深入探讨 JavaScript 中各种类型的值是如何转换为字符串的,并分析其底层原理和实际应用场景。

一、显式字符串转换

1. 使用 String() 函数

JavaScript 提供了 String() 函数用于显式地将其他数据类型转换为字符串。

console.log(String(123));       // "123"
console.log(String(true));      // "true"
console.log(String(null));      // "null"
console.log(String(undefined)); // "undefined"
console.log(String(Symbol("foo"))); // "Symbol(foo)"

对于对象,String() 方法会调用 toString() 方法来获取字符串表示。

console.log(String([1, 2, 3])); // "1,2,3"
console.log(String({
    
    a: 1}));    // "[object Object]"

2. 使用 toString() 方法

toString() 方法是所有对象的原型方法,可以用来将对象转换为字符串。

console.log((123).toString());  // "123"
console.log((true).toString()); // "true"
console.log([1, 2, 3].toString()); // "1,2,3"

但是 nullundefined 没有 toString() 方法,调用会抛出错误。

console.log(null.toString()); // TypeError: Cannot read properties of null
console.log(undefined.toString()); // TypeError: Cannot read properties of undefined

二、隐式字符串转换

1. 通过字符串拼接(+ 操作符)

+ 操作符的一侧是字符串时,JavaScript 会尝试将另一侧的值转换为字符串。

console.log("Age: " + 25);  // "Age: 25"
console.log("Score: " + true); // "Score: true"
console.log("Value: " + null); // "Value: null"
console.log("Result: " + undefined); // "Result: undefined"

对于对象,+ 操作符会先调用 toString() 方法:

console.log("Data: " + [1, 2, 3]); // "Data: 1,2,3"
console.log("Info: " + {
    
    a: 1});   // "Info: [object Object]"

2. 通过模板字符串

模板字符串会自动将插值部分转换为字符串。

console.log(`Age: ${
      
      25}`);       // "Age: 25"
console.log(`Score: ${
      
      true}`);   // "Score: true"
console.log(`Value: ${
      
      null}`);   // "Value: null"
console.log(`Result: ${
      
      undefined}`); // "Result: undefined"

三、特殊数据类型的转换规则

1. 数字类型(Number → String)

  • 数字会直接转换为其文本形式。
  • InfinityNaN 也会被转换为字符串。
console.log(String(100));   // "100"
console.log(String(-5.67)); // "-5.67"
console.log(String(NaN));   // "NaN"
console.log(String(Infinity)); // "Infinity"

2. 布尔类型(Boolean → String)

  • true 转换为 "true"
  • false 转换为 "false"
console.log(String(true));  // "true"
console.log(String(false)); // "false"

3. null 和 undefined

  • null 转换为 "null"
  • undefined 转换为 "undefined"
console.log(String(null)); // "null"
console.log(String(undefined)); // "undefined"

4. Symbol 类型

Symbol 不能隐式转换为字符串,但可以通过 String() 显式转换。

console.log(String(Symbol("foo"))); // "Symbol(foo)"
console.log("" + Symbol("foo")); // TypeError: Cannot convert a Symbol value to a string

5. 对象类型(Object → String)

对象的字符串转换规则如下:

  1. 如果对象有 toString() 方法,则调用 toString() 方法。
  2. 如果 toString() 方法返回的不是字符串,则调用 valueOf() 方法。
  3. 如果 valueOf() 也不是字符串,则返回 "[object Object]"
const obj = {
    
    
  toString() {
    
    
    return "Custom Object";
  }
};
console.log(String(obj)); // "Custom Object"

如果对象没有 toString(),则默认返回 "[object Object]"

console.log(String({
    
    })); // "[object Object]"

数组的 toString() 方法会返回逗号分隔的字符串。

console.log(String([1, 2, 3])); // "1,2,3"
console.log(String([]));       // ""

四、特殊情况下的字符串转换

1. JSON.stringify()

JSON.stringify() 可用于将对象转换为 JSON 字符串。

console.log(JSON.stringify({
    
    a: 1})); // "{"a":1}"
console.log(JSON.stringify([1, 2, 3])); // "[1,2,3]"

2. Object.prototype.toString.call()

用于检查数据类型:

console.log(Object.prototype.toString.call(null)); // "[object Null]"
console.log(Object.prototype.toString.call([]));   // "[object Array]"
console.log(Object.prototype.toString.call({
    
    }));   // "[object Object]"

五、总结

  1. String() 是显式转换的首选方式。
  2. toString() 可用于大多数情况,但 nullundefined 需要特殊处理。
  3. + 操作符会进行隐式字符串转换。
  4. Symbol 不能隐式转换为字符串。
  5. JSON.stringify() 可用于将对象转换为 JSON 格式。

推荐:


在这里插入图片描述