类型转换

类型转换内容相当繁杂

参考

冴羽blog-显式类型转换

​ 没有针对不同类型的对象做转换函数分析 valueOf toString,js高程第五章有介绍

冴羽blog-隐式类型转换

javaScript权威指南

持续补充,后期整理格式

隐式类型转换

来自于js高程第四版

记住 Number() 转换规则很重要

一元加和减(特指放在头部)

如果将一元加应用到非数值,则会执行与使用 Number()转型函数一样的类型转换。
Number转换规则如下:

  • 布尔值,true 转换为 1,false 转换为 0。
  • 数值,直接返回。
  • null,返回 0。
  • undefined,返回 NaN。
  • 字符串,应用以下规则。
    • 如果字符串包含数值字符,包括数值字符前面带加、减号的情况,则转换为一个十进制数值。 因此,Number(“1”)返回 1,Number(“123”)返回 123,Number(“011”)返回 11(忽略前面 的零)。
    • 如果字符串包含有效的浮点值格式如”1.1”,则会转换为相应的浮点值(同样,忽略前面的零)。
    • 如果字符串包含有效的十六进制格式如”0xf”,则会转换为与该十六进制值对应的十进制整 数值。
    • 如果是空字符串(不包含字符),则返回 0。
    • 如果字符串包含除上述情况之外的其他字符,则返回 NaN。
    • Number("a1"); NaN
      let num1 = Number("Hello world!"); // NaN 
      let num2 = Number(""); // 0 
      let num3 = Number("000011"); // 11 
      let num4 = Number(true); // 1 
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45

      - 对象,调用 valueOf()方法,并按照上述规则转换返回的值。如果转换结果是 NaN,则调用 toString()方法,再按照转换字符串的规则转换。

      **`-` 、`--`、 `++` 会先执行相同转换后,然后再进行运算操作**

      ## 关于运算操作符

      对于NaN +-0 +-Infinity 的操作,这里不深究

      ## 乘性操作符

      ECMAScript定义了3个乘性操作符:乘法、除法和取模,如果乘性操作符有 不是数值的操作数,则该操作数会在后台被使用 `Number()` 转型函数转换为数值。

      ## 加性操作符

      ### 加法操作符

      加法操作符(+)用于求两个数的和.

      - 如果有一个操作数是字符串,则要应用如下规则:
      - 如果两个操作数都是字符串,则将第二个字符串拼接到第一个字符串后面
      - 如果**只有一个操作数是字符串,则将另一个操作数转换为字符串**,再将两个字符串拼接在一起。
      - 如果有任一操作数是对象、数值或布尔值,则调用它们的 toString()方法以获取字符串,然后再应用前面的关于字符串的规则。对于 `undefined` 和 `null`,则调用 `String()`函数,分别获取 "undefined" 和 "null"。

      ### 减法操作符

      转换规则如下:

      - 如果有任一操作数是字符串、布尔值、null 或 undefined,则先在后台使用 Number()将其转换为数值,然后再根据前面的规则执行数学运算。如果转换结果是 NaN,则减法计算的结果是 NaN。
      - 如果有任一操作数是对象,则调用其 valueOf()方法取得表示它的数值。如果该值是 NaN,则 减法计算的结果是 NaN。如果对象没有 valueOf()方法,则调用其 toString()方法,然后再将得到的字符串转换为数值

      ## 关系操作符

      关系操作符执行比较两个值的操作,包括小于(<)、大于(>)、小于等于(<=)和大于等于(>=),用法跟数学课上学的一样。这几个操作符都返回布尔值
      与ECMAScript中的其他操作符一样,在将它们应用到不同数据类型时也会发生类型转换和其他行为:

      - 如果操作数都是数值,则执行数值比较。
      - 如果操作数都是字符串,则逐个比较字符串中对应字符的编码。
      - 如果有任一操作数是数值,则将另一个操作数转换为数值,执行数值比较。
      - 如果有任一操作数是对象,则调用其 valueOf()方法,取得结果后再根据前面的规则执行比较。如果没有 valueOf()操作符,则调用 toString()方法,取得结果后再根据前面的规则执行比较。
      - 如果有任一操作数是布尔值,则将其转换为数值再执行比较。

      > 任何关系 操作符在涉及比较 NaN 时都返回 false
      >
      >
      > let result1 = NaN < 3; // false > let result2 = NaN >= 3; // false > ```

相等操作符

等于和不等于

ECMAScript中的等于操作符用两个等于号(==)表示,如果操作数相等,则会返回 true。不等于 操作符用叹号和等于号(!=)表示,如果两个操作数不相等,则会返回 true。这两个操作符都会先进 行类型转换(通常称为强制类型转换)再确定操作数是否相等。
在转换操作数的类型时,相等和不相等操作符遵循如下规则:

  • 如果任一操作数是布尔值,则将其转换为数值再比较是否相等。false 转换为 0,true 转换 为 1。
  • 如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等。
  • 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法取得其原始值,再根据前面的规则进行比较。
  • null 和 undefined 相等。
  • null 和 undefined 不能转换为其他类型的值再进行比较。
  • 如果有任一操作数是 NaN,则相等操作符返回 false,不相等操作符返回 true。记住:即使两个操作数都是 NaN,相等操作符也返回 false,因为按照规则,NaN 不等于 NaN。
  • 如果两个操作数都是对象,则比较它们是不是同一个对象。

全等和不全等

全等和不全等操作符与相等和不相等操作符类似,只不过它们在比较相等时不转换操作数。