前言
本文整理了JavaScript中存在的显式和隐式类型转换,如果对答案有不一样见解的同学欢迎评论区补充讨论,当然有问题,也欢迎在评论区指出。
测一测,都会的话就不用往下看了,不会的,下面也不一定讲解到。。。
一、显式类型转换
1、转化为 Number 类型:
Number() / parseFloat() / parseInt()
String([1,2,3]) //"1,2,3"
String([]) // "" 即空字符串
String({}) //"[object Object]"
2、转化为 String 类型:
String() / toString()
//字符串转换为数字:空字符串变为0,如果出现任何一个非有效数字字符,结果都是NaN
Number("") //0
Number("10px") //NaN
Number("10") //10
//布尔转换为数字
Number(true) //1
Number(false) //0
//null和undefined转换成数字
Number(null) //0
Number(undefined) //NaN
//Symbol无法转换为数字
//BigInt去除“n”
Number(12312412321312312n) //12312412321312312
//对象转换为数字---------较复杂
let obj ={name:'xxx'}
console.log(obj-10) // 数学运算:先把obj隐式转换为数字,再进行运算
//运行机制
obj[Symbol.toPrimitive] //undifined 先调用对象的 Symbol.toPrimitive 这个方法,如果不存在这个方法
obj.valueof() // {name:xxx} 再调用对象的 valueOf 获取原始值,如果获取的值不是原始值
obj.toString() // [object object] 再调用对象的 toString 把其变为字符串
Number ("[object object]") // NaN 最后再把字符串基于Number()方法转换为数字
NaN-10 // NaN
3、转化为 Boolean 类型:
Boolean("1") // true
Boolean(" ") // true
Boolean("") // false 注意区别
Boolean(0) // 只有0是false
二、隐式转换
规则:尽可能保证运算不出错,然后就是在不出错的前提下,尽可能转换为String字符串
1、+、-、*、\运算符的隐式转换
除了+号,其他运算符,都是尽可能转换成Number类型,进行计算
+运算符的优先级转化顺序,布尔-----数字------字符串,如
let result = 100 + true + 21.2 + null + undefined + "Tencent" + [] + null + 9 + false;
// result应该是?
console.log(result) //NaNTencentnull9false
// 1.首先100 + true
// +连接符两边存在Number类型,true转number为1,进行加法运算,结果为:101
// 2.101 + 21.2
// +连接符两边均为Number类型,进行加法运算,结果为:122.2
// 3.122.2 + null
// +连接符两边存在Number类型,null转number为0,进行加法运算,结果为:122.2
// 4.122.2 + undefined
// +连接符两边存在Number类型,undefined转number为NaN,NaN与任何数据类型计算都为NaN,结果为:NaN
// 5.NaN + "Tencent"
// +连接符两边存在String类型,NaN转string为"NaN",进行字符串拼接,结果为:"NaNTencent"
// 6."NaNTencent" + []
// +连接符两边存在String类型,[]转string为"",进行字符串拼接,结果为:"NaNTencent"
// 7."NaNTencent" + null
// +连接符两边存在String类型,null转string为"null",进行字符串拼接,结果为:"NaNTencentnull"
// 8."NaNTencentnull" + 9
// +连接符存在String类型,9转string为"9",进行字符串拼接,结果为:"NaNTencentnull9"
// 9."NaNTencentnull9" + false
// +连接符存在String类型,false转string为"false",进行字符串拼接,结果为:"NaNTencentnull9false"
2、操作符==两边的隐式转换
如果两边数据类型不同,需要先转为相同类型,然后再进行比较
[1,2,3]=='1,2,3' //true
null==undefined //true
{}=={} //false 对象==对象 比较的是堆内存地址,地址相同则相等
console.log([1,2,3] == [1,2,3]) //false
除了以上情况,只要两边类型不一致,剩下的都是转换为数字,如:
'123' == 123 //true 即 Number('123')===123
三、注意
console.log("true" == true) //false 应该是右边的true先转化为数字1,然后1转化为字符串‘1’
console.log(["x"] == "x") //true
console.log("!!false" == "!!true") //true
console.log([] + null + 1) //null1
console.log(new Date(0) + 0) //Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)0
console.log(new Date(0) - 0) // 0
//来个好玩的
console.log((!+[]+[]+![])) //"truefalse"
// ! + "" + [] + ![] ---- true + [] + ![] ---- "true" + ![] ---"true"+!"" --- "true"+"false"
这里有 2 个特殊的规则需要记住:
- 当将 == 应用于 null 或 undefined 时,不会发生数值转换。null 只等于 null 或 undefined,不等于其他任何值。
null == 0 // false, null is not converted to 0
null == null // true
undefined == undefined // true
null == undefined // true
undefined == 0 // false
- NaN 不等于任何值,包括它自己
NaN == NaN // false
总结
觉得写得好的,对你有帮助的,可以分享给身边人,知识越分享越多,千万不要吝啬呀
后续更新前端其他小知识,请关注我,整理好,分享给你们,我们一起学前端**