类型转换
引子: 为什么类型之间可以进行转换?转换的分类有哪些?具体转换方式有哪些?
(可以先自行在脑海中思考上述问题,再继续往下阅读)
第一个问题:类型之间可以进行转换的*根本原因*是【JS 是弱类型语言】。
第二个问题:转换的分类有哪些?
通常有三种情况会涉及类型转换:【显式类型转换】、【隐式类型转换】、 【拆箱装箱】。下面分别来详细了解一下 各个情形。
2-1. 显式类型转换
显式类型转换通常有两种方式:构造函数,转换方法。
(1)调用构造函数,例如:
let a = Number('lxh')
let b = String(11111)
下面我将详细深入一下 Number()和 Boolean()两个方法的显式类型转换规则。
Number()的显式类型转换规则如下:
如果是Boolean,转换规则: true 为 1,false 为 0
如果是Number,转换规则:返回自身。
如果是null,转换规则:返回0。
如果是undefined,转换规则:返回NaN。
如果是String,转换规则:若由 纯数字、/0x开头的数字、/0X开头的数字、+或-的数字组成,则转为十进制;若由 有效浮点数组成,则转为浮点数;若由 ''(空字符串)组成,则转为0;若均不满足以上条件,则返回NaN。
如果是Symbol,转换规则:报错。
如果是是Object,转换规则:若内置 [Symbol.toPrimitive]则调用Number,否则调用valueOf();若上一步返回值为 NaN,则调用toString()。
Boolean()的显式类型转换规则如下:
除了 undefined、null、false、''、0(包括+0,-0)、NaN 转换出来是 false,其他都是 true。
(2)调用方法,例如:
转字符串:toString() 转数字: parseInt(),parseFloat()
2-2. 隐式类型转换
隐式类型转换通常有三种情况会发生: 操作符, if/while判断, == 。
复杂数据类型在隐式转换时,先调用 valueOf,再调用 toString。 空数组的 toString()方法会得到空字符串,而空对象的 toString()方法会得到字符串 [objectObject]
(1)操作符
一元正负:+ - 遇到字符串,转 Number。
&&,||,!,*,/,%:遇到字符串,转 Number。
二元加减:+ - 遇到字符串,+转 String,-转 Number。
下面我将详细深入一下 +操作符的隐式类型转换规则:
Number+Number ,进行加法运算;
String+String,进行字符串拼接;
String+(undefined/null/Boolean),调用【toString()】方法进行字符串拼接;
String+(纯Object/Array/RegExp),分情况调用Object的【toString()】或【ValueOf()】转为基本数据类型,再进行字符串拼接;
Number+(undefined/null/Boolean/Number),转为数字进行加法运算;
Number+(纯Object/Array/RegExp),分情况调用Object的toString()或ValueOf()转为基本数据类型,再进行字符串拼接;
Number+String,进行字符串拼接;
关于Object的toString()或ValueOf(),见下一小节「003 JS装箱拆箱」。
// todo 代码插图
(2)判断语句
i