JS类型转换

转布尔

使用Boolean函数将类型转换成布尔类型

除了👇的情况,其他都转换成true

1
2
3
4
5
6
7
8
console.log(Boolean()) 
console.log(Boolean(false))
console.log(Boolean(undefined))
console.log(Boolean(null))
console.log(Boolean(0))
console.log(Boolean(+0))
console.log(Boolean(NaN))
console.log(Boolean(""))

原始值转数字

使用Number函数转换为数字,如果无法转换则返回NaN

Number

参数类型 结果
undefined NaN
null +0
Bollean true=>1 false=>0
Number 原样返回
String 将字符串转化成一个整数或浮点数 无法解析的转成NaN
1
2
3
4
5
6
7
8
9
10
11
12
console.log(Number("123")); //123
console.log(Number("-123")); //-123
console.log(Number("1.2")); //1.2
console.log(Number("000123")); //123 会忽略前置0
console.log(Number("-00123")); //-123
console.log(Number("0x11")); //17 0x16进制转换
console.log(Number("")); //0
console.log(Number(" ")); //0
//无法解析的情况
console.log(Number("123 123")) //NaN
console.log(Number("foo")) //NaN
console.log(Number("100a")) //NaN 如果有一个字符不是数字,结果都会返回 NaN

parseIntparseFloat

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

1
2
3
console.log(parseInt("3 abc")) //3
console.log(parseFloat("-3.4ddd")) //-3.4
console.log(parseFloat(".1")) // 0.1

原始值转字符串

转化为对应的字符串形式

原始值转对象

通过类型的构造函数转化成包装对象

1
2
3
4
const num = 1;
console.log(typeof num); //number
const obj = new Number(num);
console.log(typeof obj); //object

对象转布尔

所有对象(包括数组和函数)都转换为 true

对象转字符串

  • 如果对象具有toString方法,则调用这个方法.如果返回一个原始值,JavaScript将这个值转化为字符串,并返回字符串结果
  • 如果对象没有toString,或者这个方法返回的不是一个原始值,则调用valueOf,如果是原始值将这个值转化为字符串,并返回字符串结果
  • 前两种都无法获得一个原始值,则抛类型错误异常
  • String(obj)

对象转数字

  • 先调用valueOf,返回一个原始值,则转化为数字返回
  • 否则调用toString,返回一个原始值,转化为数字返回
  • 都不满足,则跑类型错误异常
  • Number(obj)

一元操作符+

可以理解为将数据转化为number

1
2
3
4
5
console.log(+true); //1
console.log(+false) //0
console.log(+"1"); //1
console.log(+{}) //NaN
console.log(+"1a") //NaN

二元操作符+

  • 任意一边存在字符串,则转化为字符串
  • 不存在字符串,任意一边是数组,则转化为数字
  • 任意一边不是数字,比如数组,或对象,则转化为数字

==

x==y规范

  1. x,y同类型
    1. x是undefined,返回true
    2. x是null,返回true
    3. x是数字
      1. x或y是NaN,返回false
      2. +0,-0返回true
      3. x,y相等,返回true
      4. 其他返回false
    4. x是字符串,完全相等返回true
    5. x是布尔,xy都是true或false,返回true,其他false
    6. x,y指向同一个对象返回true,其他false
  2. null,undefined在宽松相等下是true
  3. 字符串和数字比较,优先转化为数字
  4. 布尔值优先转化为数字
  5. x,y一个是字符串或数字,一个是对象,将对象先valueOf,然后toString比较

参考资料

感谢冴羽大佬-深入系列的类型转换