MST

星途 面试题库

面试题:JavaScript数据类型转换的底层机制

详细阐述JavaScript引擎在执行不同数据类型之间转换时,特别是对象到原始值转换(ToPrimitive操作)的底层机制,包括涉及到的内部方法和顺序。
44.0万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

对象到原始值转换(ToPrimitive操作)的底层机制

  1. 概述:当JavaScript引擎需要将一个对象转换为原始值时,会执行ToPrimitive操作。这个操作会尝试调用对象的valueOftoString方法来获取原始值。
  2. 内部方法
    • [[DefaultValue]]:这是一个内部方法,用于执行ToPrimitive操作。当对象需要被转换为原始值时,会调用这个内部方法。
    • [[Get]]:用于获取对象的属性值,在获取valueOftoString方法时会用到。
  3. 转换顺序
    • Number类型偏好(默认)
      • 首先,JavaScript引擎会检查是否有显式的hint参数。如果没有,默认hint"number"
      • 然后,引擎会调用对象的valueOf方法。如果valueOf方法返回的是原始值,则返回该原始值。例如:
const obj = {
  valueOf: function() {
    return 42;
  }
};
const result = obj + 1; // 这里obj会进行ToPrimitive操作,由于valueOf返回原始值42,结果为43
 - 如果`valueOf`方法返回的不是原始值(仍然是对象),则调用`toString`方法。如果`toString`方法返回原始值,则返回该原始值。例如:
const obj = {
  toString: function() {
    return "42";
  }
};
const result = obj + 1; // 这里obj会进行ToPrimitive操作,valueOf返回对象,调用toString返回"42",结果为"421"
 - 如果`toString`方法返回的也不是原始值(仍然是对象),则抛出`TypeError`。
  • String类型偏好
    • 当有显式的hint参数且为"string"时,会先调用toString方法。如果toString方法返回原始值,则返回该原始值。例如:
const obj = {
  toString: function() {
    return "hello";
  }
};
const result = String(obj); // 这里显式转换为字符串,调用toString返回"hello"
 - 如果`toString`方法返回的不是原始值(仍然是对象),则调用`valueOf`方法。如果`valueOf`方法返回原始值,则返回该原始值。
 - 如果`valueOf`方法返回的也不是原始值(仍然是对象),则抛出`TypeError`。