关于JS的类型转换

一、数据类型

JS一共有六种简单的数据类型:undefined、null、boolean、string、number、symbol,以及三种引用类型:function、object、array.

但是JS在声明的时候只用一种类型,只有到运行的时候才能确定当前的类型。在运行期间,由于JS没有对类型做严格限制,导致不同类型

之间可以进行运算,这样就需要允许类型之间相互转换

二、类型转换

1、显式类型转换

显示类型转换就是手动将一种值转换为另一种值。

转换为Number类型Number() / parseFloat() / parseInt()
转换为String类型String()/ toString()
转换为Boolean类型Boolean()

常见的显示类型转换方法有Number、String、Boolean、parseInt、parseFloat、toString

(1)parseInt():转化为整数并取整直接舍去小数

a、概念

parseInt(string,radix)解析一个字符串并返回指定基数的十进制整数,radix是2-36之间的整数,表示被解析的字符串的基数
string : 
	要被解析的值。如果参数不是一个字符串,则将其转换为字符串。字符串开头的空白符将会被忽略
radix(可选):
	从2到36,表示字符串的基数。类如,指定16表示被解析值是十六进制数。请注意,10不是默认值
返回值:
	从给定的字符串中解析出一个**整数**,但是当radix小于2或者大于36,或者第一个非空格字符不能转换为数字,返回NaN

b、例子:

console.log([1,2,3].map(parseInt));//[1,NaN,NaN]

关于上述例子的详细解析

(2)parseFloat():转化为一个浮点数

a、概念

parseFloat(string):函数解析一个参数(必要时先转换为字符串)并返回一个浮点数
string:
	需要解析为浮点数的值
返回值:
	给定值被解析为浮点数。如果给定值不能被转换为数值,则会返回NaN

(3)Number():将其它类型转换到number类型

原始值转换结果
undefinedNaN
null0
true1
false0
String根据语法和转换规则来转换
SymbolThrow a TypeError exception
Object先调用toPrimitive,再调用toNumber

String 转换为 Number 类型的规则:

1、如果字符串中只包含数字,那么就转换为对应的数字
2、如果字符串中只包含十六进制格式,那么就转换为对应的十进制数字
3、如果字符串为空,那么转换为0
4、如果字符串包含上述之外的字符,那么转换为NaN

使用 + 可以将其它类型转换为number类型:

+undefined // NaN
 +null // 0
 +true // 1
 +false // 0
 +'111' // 111
 +'0x100F' // 4111
 +'' // 0
 'b' + 'a' + + 'a' + 'a' // 'baNaNa'
 +Symbol() // Uncaught TypeError: Cannot convert a Symbol value to a number

(4)Boolean():将其它类型转换为boolean类型

原始值转换结果
undefinedfalse
booleantrue or false
Number0和NaN返回false,其他返回true
Symboltrue
Objecttrue

(5)String():将其它类型转换为字符串

原始值转换结果
undefined‘undefined’
boolean‘true’ or ‘false’
Number对应的字符串类型
StringString
SymbolThrow a TypeError exception
Object先调用toPrimitive,再调用toNumber

转换到string类型可以用模板字符串来实现:

`${undefined}` // 'undefined'
 `${true}` // 'true'
 `${false}` // 'false'
 `${11}` // '11'
 `${Symbol()}` // Cannot convert a Symbol value to a string
 `${{}}`

(6)toString():返回一个表示该对象的字符串

2、隐式类型转换

隐式类型转换都会调用显示类型

(1)数学运算符中的类型转换

a、减、乘、除:我们在对各种非Number类型运用数学运算符(- * /)时,会先将非Number类型转换为Number类型

1 - true // 0, 首先把 true 转换为数字 1, 然后执行 1 - 1
1 - null // 1,  首先把 null 转换为数字 0, 然后执行 1 - 0
1 * undefined //  NaN, undefined 转换为数字是 NaN
2 * ['5'] //  10, ['5']首先会变成 '5', 然后再变成数字 5

b、加法的特殊性

规则1:当一侧为String类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型
规则2:当一侧为Number类型,另一侧为原始类型,则将原始类型转换为Number类型
规则3:当一侧为Number类型,另一侧为引用类型,将引用类型和Number类型转换成字符串后拼接
123 + '123' // 123123   (规则1)
123 + null  // 123    (规则2)
123 + true // 124    (规则2)
123 + {}  // 123[object Object]    (规则3)

(2)逻辑语句中的类型转换

当我们使用 if while for 语句时,我们期望表达式是一个Boolean,所以一定伴随着隐式类型转换。而这里面又分为两种情况:

a、单个变量

如果只有单个变量,会先将变量转换为Boolean值
只有null    undefined   ''   NaN    0    false   这几个是  false,其他情况都为true,比如{},[]

b、使用==比较中的五条规则

规则1:
	NaN和其他任何类型比较永远返回false(包括和他自己)
	
	NaN == NaN //false

规则2:
	Boolean 和其他任何类型比较,Boolean 首先被转换为 Number 类型

	true == 1  // true 
	true == '2'  // false, 先把 true 变成 1,而不是把 '2' 变成 true
	true == ['1']  // true, 先把 true 变成 1, ['1']拆箱成 '1', 再参考规则3
	true == ['2']  // false, 同上
	undefined == false // false ,首先 false 变成 0,然后参考规则4
	null == false // false,同上
	
规则 3:
	String和Number比较,先将String转换为Number类型

	123 == '123' // true, '123' 会先变成 123
	'' == 0 // true, '' 会首先变成 0

规则 4:
	null == undefined比较结果是true,除此之外,null、undefined和其他任何结果的比较值都为false

	null == undefined // true
	null == '' // false
	null == 0 // false
	null == false // false
	undefined == '' // false
	undefined == 0 // false
	undefined == false // false

规则 5:
	原始类型和引用类型做比较时,引用类型会依照ToPrimitive规则转换为原始类型
	
	ToPrimitive规则,是引用类型向原始类型转变的规则,它遵循先valueOf后toString的模式期望得到一个原始类型
	
	'[object Object]' == {} 
	// true, 对象和字符串比较,对象通过 toString 得到一个基本类型值
	'1,2,3' == [1, 2, 3] 
	// true, 同上  [1, 2, 3]通过 toString 得到一个基本类型值

C、隐式类型转换练习题:

1. [] == ![]

	- 第一步,=  右边先执行,![] 会变成 false
	- 第二步,应用 规则2 ,题目变成: [] == 0
	- 第三步,应用 规则5 ,[]的valueOf是0,题目变成: 0 == 0
	- 所以, 答案是 true !
	
2. [undefined] == false
	- 第一步,应用 规则5 ,[undefined]通过toString变成 '',
	  题目变成  '' == false
	- 第二步,应用 规则2 ,题目变成  '' == 0
	- 第三步,应用 规则3 ,题目变成  0 == 0
	- 所以, 答案是 true !
	// 但是 if([undefined]) 又是个true
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值