JS 类型转换

67 阅读3分钟

1. JS内置函数转换

1.1 Boolean() 布尔类型转换

在使用Boolean()函数转换只有6中可以转换成false,其余都转换成true

console.log(Boolean(false)); // false
console.log(Boolean(0)); // false
console.log(Boolean(+0)) // false
console.log(Boolean(-0)) // false
console.log(Boolean(NaN)) // false
console.log(Boolean("")); // false
console.log(Boolean(undefined)) // false
console.log(Boolean(null)) // false

1.2 数字类型转换

原始类型转换成数字类型有几个函数可以进行使用,如下

Number()

对于Number()函数,对true和false转换成1和0,对于数字+其他字符就会转换成NaN,

console.log(Number(false)); // 0
console.log(Number(true)); // 1


console.log(Number("sfdsfsd999")); // NaN
console.log(Number("990")); // 990
console.log(Number("433s")); // NaN
console.log(Number("ewr")); // NaN
console.log(Number("343.343")); // 343.343

parseInt()和parseFloat()函数

如果通过 Number 转换函数传入一个字符串,它会试图将其转换成一个整数或浮点数,而且会忽略所有前导的 0,如果有一个字符不是数字,结果都会返回 NaN,鉴于这种严格的判断,我们一般还会使用更加灵活的 parseInt 和 parseFloat 进行转换。

parseInt 只解析整数,parseFloat 则可以解析整数和浮点数,如果字符串前缀是 "0x" 或者"0X",parseInt 将其解释为十六进制数,parseInt 和 parseFloat 都会跳过任意数量的前导空格,尽可能解析更多数值字符,并忽略后面的内容。如果第一个非空格字符是非法的数字直接量,将最终返回 NaN:

console.log(parseFloat("3.14 abc")) // 3.14
console.log(parseInt("-12.34")) // -12
console.log(parseInt("0xFF")) // 255
console.log(parseFloat(".1")) // 0.1
console.log(parseInt("0.1")) // 0

1.3 原始类型转字符串 String()


console.log(String(undefined)) // undefined
console.log(String(null)) // null

console.log(String(false)) // false
console.log(String(true)) // true

console.log(String(0)) // 0
console.log(String(-0)) // 0
console.log(String(NaN)) // NaN
console.log(String(Infinity)) // Infinity
console.log(String(-Infinity)) // -Infinity
console.log(String(1)) // 1

2 隐式转换

一元操作符 +

  1. 如果 obj 为基本类型,直接返回
  2. 否则,调用 valueOf 方法,如果返回一个原始值,则 JavaScript 将其返回。
  3. 否则,调用 toString 方法,如果返回一个原始值,则JavaScript 将其返回。
  4. 否则,JavaScript 抛出一个类型错误异常。
console.log(+[]); // 0
console.log(+[1]); // 1

二院操作符 +

简单就是将两边如果有一边是字符串那么转换成字符串进行拼接,否则调用ToNumber()进行运算

  1. lprim = ToPrimitive(value1)
  2. rprim = ToPrimitive(value2)
  3. 如果 lprim 是字符串或者 rprim 是字符串,那么返回 ToString(lprim) 和 ToString(rprim)的拼接结果
  4. 返回 ToNumber(lprim) 和 ToNumber(rprim)的运算结果
console.log([] + []); // ""
console.log([] + {}); // [object Object]
console.log({} + []); // [object Object]

== 运算符

当执行x == y 时:

  1. 如果x与y是同一类型:
    1. x是Undefined,返回true
    2. x是Null,返回true
    3. x是数字:
      1. x是NaN,返回false
      2. y是NaN,返回false
      3. x与y相等,返回true
      4. x是+0,y是-0,返回true
      5. x是-0,y是+0,返回true
      6. 返回false
    4. x是字符串,完全相等返回true,否则返回false
    5. x是布尔值,x和y都是true或者false,返回true,否则返回false
    6. x和y指向同一个对象,返回true,否则返回false
  2. x是null并且y是undefined,返回true
  3. x是undefined并且y是null,返回true
  4. x是数字,y是字符串,判断x == ToNumber(y)
  5. x是字符串,y是数字,判断ToNumber(x) == y
  6. x是布尔值,判断ToNumber(x) == y
  7. y是布尔值,判断x ==ToNumber(y)
  8. x是字符串或者数字,y是对象,判断x == ToPrimitive(y)
  9. x是对象,y是字符串或者数字,判断ToPrimitive(x) == y
  10. 返回false

比较好记的方法: 如果操作数是布尔值,则先转换为数值,其中 false 转为 0,true 转换为 1。 如果一个操作数是字符串,另一个操作数是数字,则先尝试把字符串转换为数字。 如果一个操作数是字符串,另一个操作数是对象,则先尝试把对象转换为字符串。 如果一个操作数是数字,另一个操作数是对象,则先尝试把对象转换为数字。 如果两个操作数都是对象,则比较引用地址。如果引用地址相同,则相等;否则不等。

本文引用:github.com/mqyqingfeng…