返回

从 ES 规范的角度深入理解 +、Number 类型转换

前端

前言

JavaScript 中的类型转换是一个非常重要的概念,它允许我们将一种数据类型的值转换为另一种数据类型的值。这在许多情况下都很有用,例如,当我们需要将数字转换为字符串以便在 HTML 中显示时,或者当我们需要将字符串转换为数字以便进行计算时。

在 JavaScript 中,类型转换有两种主要方式:

  • 隐式类型转换: 这是 JavaScript 自动执行的类型转换,它不需要程序员显式地指定。例如,当我们使用 + 运算符将数字和字符串连接在一起时,JavaScript 会自动将字符串转换为数字。
  • 显式类型转换: 这是程序员明确指定的类型转换,它可以通过使用 Number()、String() 或 Boolean() 函数来实现。例如,当我们想将字符串转换为数字时,我们可以使用 Number() 函数。

ES 规范中的类型转换

在 ES 规范中,类型转换的规则定义在 9.9 ToPrimitive 节中。该节规定了当对象要被转换为数字或者字符串时,将会涉及到 ToPrimitive 方法。ToPrimitive 方法有两个参数:

  • Hint: 一个字符串,指定要转换的目标类型,可以是 "number" 或 "string"。
  • Default: 如果对象没有 ToPrimitive 方法,或者 ToPrimitive 方法返回 undefined 或 null,那么将使用 Default 作为转换结果。

ToPrimitive 方法的执行过程如下:

  1. 如果对象有一个名为 Symbol.toPrimitive 的 Symbol 属性,那么将调用该属性对应的函数,并传入 Hint 作为参数。
  2. 如果对象没有 Symbol.toPrimitive 属性,或者 Symbol.toPrimitive 属性对应的函数返回 undefined 或 null,那么将调用对象的 valueOf 方法,并传入 Hint 作为参数。
  3. 如果对象没有 valueOf 方法,或者 valueOf 方法返回 undefined 或 null,那么将调用对象的 toString 方法,并传入 Hint 作为参数。
  4. 如果以上三个步骤都返回 undefined 或 null,那么将抛出一个 TypeError 异常。

+ 运算符的类型转换

  • 运算符可以用于将两种不同类型的值连接在一起。如果操作数之一是字符串,那么另一