Skip to content

类型转换

  • Date() 构造函数,当它收到一个不是 Date 实例的参数时——字符串表示日期字符串,而数值表示时间戳。
  • + 运算符——如果运算对象(两边只要有一边儿是)是字符串,执行字符串串联;否则,执行数值相加。
  • == 运算符——如果一个运算对象是原始值,而另一个运算对象是对象(object),则该对象将转换为没有首选类型的原始值。

alt text

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

{} 和 [] 都没有 [Symbol.toPrimitive]() 方法。{} 和 [] 都从 Object.prototype.valueOf 继承 valueOf(),其返回对象自身。因为返回值是一个对象,因此它被忽略。因此,调用 toString() 方法。{}.toString() 返回 "[object Object]",而 [].toString() 返回 "",因此这个结果是它们的串联:"[object Object]"

有三种不同的路径可以将对象转换为原始值:

boolean

  • undefined turns into false.
  • null turns into false.
  • 0-0, and NaN turn into false; other numbers turn into true.
  • 0n turns into false; other BigInts turn into true.
  • The empty string "" turns into false; other strings turn into true.
  • Symbols turn into true.
  • All objects become true.

String

  • 字符串按原样返回。
  • undefined 转换成 "undefined"
  • null 转换成 "null"
  • true 转换成 "true"false 转换成 "false"
  • 使用与 toString(10) 相同的算法转换数字。
  • 使用与 toString(10) 相同的算法转换 BigInt
  • Symbol 抛出 TypeError
  • 对于对象,首先,通过依次调用其 [Symbol.toPrimitive]()(hint 为 "string")、toString() 和 valueOf() 方法将其转换为原始值。然后将生成的原始值转换为一个字符串。

Number

  • Number 将按原样返回
  • undefined 转换为 NaN
  • null 转换为 0
  • true 转换为 1false 转换为 0
  • 字符串将被假定为包含数字字面量,并通过解析它们来转换。解析失败会得到 NaN。与实际数字字面量相比,它们有一些细微的差别:
    • 前导和尾随的空格/换行符会被忽略。
    • 前导的数字 0 不会导致该数值成为八进制字面量(或在严格模式下被拒绝)。
    • + 和 - 允许出现在字符串的开头以指示其符号。(在实际代码中,它们“看起来像”文字的一部分,但实际上是独立的一元运算符。)然而,该标志只能出现一次,并且后面不能跟空格。
    • Infinity 和 -Infinity 被当作是字面量。在实际代码中,它们是全局变量。
    • 空字符串或仅包含空格的字符串转换为 0
    • 不允许使用数字分隔符
  • BigInt 抛出 TypeError,以防止意外的强制隐式转换导致精度损失。
  • Symbol 抛出 TypeError
  • 对象首先通过按顺序调用它们的 [Symbol.toPrimitive]()(使用 "number" 提示)、valueOf() 和 toString() 方法将其转换为原始值。然后将得到的原始值转换为数字。

Object

另外

parseInt()

parseInt相比Number,就没那么严格了,parseInt函数逐个解析字符,遇到不能转换的字符就停下来

js
parseInt('32a3') //32

除了+有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值

js
'5' - '2' // 3
'5' * '2' // 10
true - 1  // 0
false - 1 // -1
'1' - 1   // 0
'5' * []    // 0
false / '5' // 0
'abc' - 1   // NaN
null + 1 // 1
undefined + 1 // NaN

null转为数值时,值为0 。undefined转为数值时,值为NaN

等号

等于操作符(==)在比较中会先进行类型转换,再确定操作数是否相等

nullundefined相等

如果有任一操作数是 NaN ,则相等操作符返回 false

如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法取得其原始值,再根据前面的规则进行比较

如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true

全等操作符由 3 个等于号( === )表示,只有两个操作数在不转换的前提下相等才返回 true。即类型相同,值也需相同

js
'' == '0' // false
0 == '' // true
0 == '0' // true

false == 'false' // false
false == '0' // true

false == undefined // false
false == null // false
null == undefined // true

' \t\r\n' == 0 // true