HLJ 发布于
2025-06-11 09:34:45
0阅读

JavaScript 对象 —— 原始值转换

上一篇文章:

JavaScript Symbol 类型

JavaScript 对象 —— 原始值转换

在 JavaScript 中,当对象需要被转换为原始值(字符串、数字或布尔值)时,会遵循特定的转换规则。这种转换通常发生在以下情况:

  • 使用 alert(obj) 输出对象
  • 使用 obj1 + obj2 进行对象相加
  • 使用 Number(obj)+obj 将对象转换为数字
  • 使用 String(obj) 或将对象作为属性键时

转换规则

JavaScript 对象到原始值的转换遵循以下步骤:

  1. 检查 Symbol.toPrimitive 方法(ES6新增)
  2. 如果没有 Symbol.toPrimitive,则检查 valueOf() 方法
  3. 如果 valueOf() 不存在或返回非原始值,则检查 toString() 方法

具体转换流程

1. 转为字符串(string hint)

alert(obj);
// 等价于
alert(String(obj));

转换顺序:

  1. 调用 obj[Symbol.toPrimitive]('string')(如果存在)
  2. 否则调用 obj.toString()(如果存在)
  3. 否则调用 obj.valueOf()(如果存在)
  4. 否则抛出 TypeError

2. 转为数字(number hint)

Number(obj);
// 或数学运算(除了加法)
+obj;

转换顺序:

  1. 调用 obj[Symbol.toPrimitive]('number')(如果存在)
  2. 否则调用 obj.valueOf()(如果存在)
  3. 否则调用 obj.toString()(如果存在)
  4. 否则抛出 TypeError

3. 默认情况(default hint)

加法运算 +== 比较时:

obj1 + obj2;
obj == primitive;

转换顺序与数字转换相同(默认 hint 会被视为 number)

Symbol.toPrimitive

ES6 引入了 Symbol.toPrimitive 方法,可以更精确地控制转换行为:

let user = {
  name: "John",
  money: 1000,

  [Symbol.toPrimitive](hint) {
    console.log(`hint: ${hint}`);
    return hint == "string" ? `{name: "${this.name}"}` : this.money;
  }
};

// 转换演示:
alert(user); // hint: string -> {name: "John"}
console.log(+user); // hint: number -> 1000
console.log(user + 500); // hint: default -> 1500

valueOf 和 toString

如果没有 Symbol.toPrimitive,JavaScript 会尝试 valueOftoString

let user = {
  name: "John",
  money: 1000,

  // 对于 hint="string"
  toString() {
    return `{name: "${this.name}"}`;
  },

  // 对于 hint="number" 或 "default"
  valueOf() {
    return this.money;
  }
};

alert(user); // toString -> {name: "John"}
console.log(+user); // valueOf -> 1000
console.log(user + 500); // valueOf -> 1500

默认的 toString 和 valueOf

所有对象都从 Object.prototype 继承了默认的 toStringvalueOf 方法:

  • toString 默认返回 "[object Object]"
  • valueOf 默认返回对象本身(不是原始值,因此通常会被忽略)

布尔转换

对象到布尔值的转换很简单:所有对象(包括空对象)在布尔上下文中都是 true

if ({} || new Date()) {
  // 这里的代码总会执行
}

总结转换规则

场景 转换 hint 方法调用顺序
String(obj) "string" Symbol.toPrimitive → toString → valueOf
Number(obj)+obj "number" Symbol.toPrimitive → valueOf → toString
obj + objobj == value "default" Symbol.toPrimitive → valueOf → toString
布尔上下文 总是 true

理解这些转换规则对于避免 JavaScript 中的意外行为非常重要,特别是在进行对象操作和比较时。

当前文章内容为原创转载请注明出处:http://www.good1230.com/detail/2025-06-11/789.html
最后生成于 2025-06-13 20:52:37
上一篇文章:

JavaScript Symbol 类型

此内容有帮助 ?
0