JavaScript的显示和隐式类型转换

468 阅读4分钟

前言

本文整理了JavaScript中存在的显式和隐式类型转换,如果对答案有不一样见解的同学欢迎评论区补充讨论,当然有问题,也欢迎在评论区指出。

测一测,都会的话就不用往下看了,不会的,下面也不一定讲解到。。。 image.png

一、显式类型转换

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 个特殊的规则需要记住:

  1. 当将 == 应用于 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
  1. NaN 不等于任何值,包括它自己
NaN == NaN  // false

总结

觉得写得好的,对你有帮助的,可以分享给身边人,知识越分享越多,千万不要吝啬呀

后续更新前端其他小知识,请关注我,整理好,分享给你们,我们一起学前端**