数据类型转换

116 阅读3分钟

js数据类型转换


js数据类型

基本数据类型 number、string、undefined、null、boolean、symbol、bigint

应用数据类型

  • 标准普通对象: object
  • 标准特殊对象: Array、RegExp、Date、Math、Error...
  • 非标准特殊对象(包装对象):Number、String、Boolean...
  • 可调用对象/执行对象:function

其它类型转换为数字型

Number([val]) 转换规则:

  • 字符串转换为数字:空字符串转为0,如果出现的是任何非有效数字字符,结果都是NaN
Number(''); // 0
Number('12a'); // NaN
  • 布尔值转换为数字
Number(true); // 1
Number(false); // 0
  • null 和 undefined
Number(null); // 0
Number(undefined); // NaN
  • Symbol无法转换为数字,会报错:Uncaught TypeError: Cannot convert a Symbol value to a number
  • BigInt去除'n'(超过安全数字的,会按照科学计数法处理)
Number(10n); // 10
  • 把对象转换为数字

    • 先调用对象的Symbol.toPrimitive方法,如果不存在该方法

    • 在调用对象的valueOf获取原始值,如果获取的值不是原始值

    任何一个对象都有valueOf方法,即便这个对象上没有也会通过原型链找到Object对象的原型上的valueOf

    • 在调用对象的toString 将其转换为字符串
    • 最后在把字符串基于Number方法转换为数字

parseInt([val],[radix]) 参数说明:

  • [val]:必须是一个字符串,如果不是先隐式转换为字符串【通过String([val])转换】

注意:val为数字时,也会被转换为字符串。

  • [radix]

    • 如果不写,或者写0:默认是10进制【特殊情况:如果字符串是以0x开始的,默认是16进制】

    • 有效范围:2~36之间【如果不在这个区间,结果直接是NaN】

    进制的范围:

    • 2进制:01
    • 3进制:012
    • 8进制:0~7
    • 10进制:0~9
    • 16进制:09 AF
    • 36进制:09 AZ

转换规则:

  1. 从字符串左侧的第一个字符开始寻找,查找出符合[radix]进制的值
  2. 把找到的内容,按照[radix]进制转换为10进制的数字

注意:一个都没找到就是NaN

  1. 遇到一个非有效数字字符,不论后面是否是有效数字字符,都不在查找了
parseInt('12px13',2); // 1
parseInt('10102px13',2); // 1010 => 10

特殊案例:

// JS遇到以0开始的“数字”,会默认将其按照8进制转为10进制,然后在进行其他操作
// 0013 = > 11
parseInt(0013,2); // 3

parseFloat([val],[radix]) 同parseInt,只是parseFloat可以多识别一个小数点

其它类型转换为字符串

String([val]) 转换规则:

  • 若val是一个原始值,则转换结果直接包裹括号即可
  • 若val是一个对象,转换规则同其它类型转数字

"+"出现字符串拼接的情况:

  • "+"两边,一边是字符串
0 + ''; // '0'
  • "+"两边,一边是对象
// 这个表达式不能理解
{} + 0; // 0
  • "+"出现在值的左侧,该值会转换为数字
var d = '10a';
+d; // Number(d)

其他数据类型转换为布尔值

转换规则:

  • 除0、NaN、空字符串、null、undefined返回的值是false外,其余都是true

"=="比较时的相互转换规则

两边数据类型不同,需要先转换为相同的类型,然后在进行比较 转换规则:

  • 对象==字符串,对象转字符串【Symbol.toPrimitive -> valueOf -> toString】
  • null == undefined
null == undefined; // true
  • 对象==对象;比较的是内存地址,地址相同则相等
  • NaN !== NaN true
NaN !== NaN; //  true
Object.is(NaN,NaN); // true

js判断NaN的四种方法

  • 除了以上情况,只要两边类型不一致,剩下的都是转换为数字,然后在进行比较
[] == false; // true 两边都转换为数字
![] == false; // true 先处理![] -> false false == false -> true

JS装箱和拆箱

装箱操作:把原始值变为非标准特殊对象

let num = 10
// num进行了装箱操作
// new Number(num)
console.log(num.toFixed(2)) //10.00

拆箱操作:把原始值变为把非标准特殊对象变为原始值

let num = new Number(10)
// num进行了拆箱操作
// 【Symbol.toPrimitive -> valueOf -> toString -> Number】
console.log(num+10) //20