一文带你了解JavaScript的隐式类型转换
在了解隐式类型转换之前,你需要知道JavaScript的数据类型、数据类型之间的相互转换(强制/显示类型转换)。
JavaScript的数据类型
在JS中,数据类型可以分为:
- 简单数据类型(Number、String、Boolean、undefined、null)
- 复杂数据类型(Function、Obiect、Array)
JavaScript的显示转换
一般数据类型转换,通常指的是"简单数据类型"之间的相互转换。
以下的这种转换也叫"显示转换"、"强制转换"。
- 其他 转 Number
- 其他 转 String
- 其他 转 Boolean
其他转Number
语法:Number() parseInt() parseFloat()
- String ==> Number
// 说明:Number() 用于其他任意数据类型,parseInt()、parseFloat() 一般用于纯数字字符串 // 1 纯数字字符串 var str1 = '1234567' // 字符串类型 Number(str1) // 1234567 数值类型 // 2 非纯数字字符串 [记住结果是NaN] var str2 = '1234567abcd' Number(str2) // NaN (not a number) 但却是数值类型 // 3 纯数字的带小数点的字符串 parseInt()、parseFloat() var str3 = '123456.789' Number(str3) // 123456.789 数值类型 parseInt(str3) // 123456 仅保留整数部分,数值类型 parseFloat(str3) // 123456.789 即保留整数部分,也保留小数部分,数值类型
- Boolean ==> Number
// Boolean 值有两种:true false var b1 = true var b2 = false Number(b1) // 1 Number(b2) // 0 // 若布尔值结果为 true会转为1,false会转为0
- undefined ==> Number
var num // 声明一个变量未赋值,结果是undefined Number(num) // NaN [记住这种特殊情况]
- null ==> Number
// null 表示空 也就是没有 var m = null Number(m) // 0
其他转String
语法:String() toString()
- Number ==> String
// 直接转为纯数字字符串 String() var num1 = 1234567 var num2 = 1234567.89 String(num1) // '1234567' 字符串类型 String(num2) // '1234567.89' 字符串类型 // 转为xx进制的字符串 toString(几进制) // 转为二进制 num1.toString(2) // 100101101011010000111 num1.toString(2) // 100101101011010000111.11100011110101110000101000111101 // 转为十六进制 num1.toString(16) // 12d687 num2.toString(16) // 12d687.e3d70a3d
- Boolean ==> String
// 布尔值两种均可使用,但不会转为xx进制 var b1 = true var b2 = false String(b1) // "true" b2.toString() // "false"
- undefined ==> String
// 只能使用 String() var n // 变量定义未赋值,结果是undefined String(n) // "undefined"
- Null ==> String
// 只能使用 String() var n = null // 将变量赋值为null 代表为空 String(n) // "null"
其他转Boolean
语法:Boolean()
- Number ==> Boolean
// 数字0 var num1 = 0 Boolean(num1) // false // NaN var n var num2 = Number(n) // NaN Boolean(num2) // false // 其他数字 var num3 = 123.456 Boolean(num3) // true
- String ==> Boolean
var str1 = "" // 空字符串 var str2 = "hell0 world" // 非空字符串 Boolean(str1) // false Boolean(str2) // true
- undefined ==> Boolean
var m Boolean(m) // false
- Null ==> Boolean
var m = null Boolean(m) // false
JavaScript的隐式转换
隐式转换一般会发生在JavaScript的运算时,所以在了解之前,你需要知道关于运算符的相关知识。
在JS中运算符一般分为:
- 一元运算符
- 二元运算符,隐式转换一般发生在二元运算符中
- 三元运算符
一元运算符
一般也叫自增自减运算符,如:i++ i--,也分为前、后自增/自减
- 前自增/自减:++i --i
- 后自增/自减:i++ i--
- 区别:前者是先自增/自减,再使用;后者是先使用,再自增/自减
/* i++ 相当于 i = i+1 在运算时,有几个值需要关注 + i自身的值 + i++后的变化(表达式的值) + 当前项的值 */ 举个例子: var b = -3 console.log(--b + b-- + b++ + b + --b + ++b); // -26 表达式: --b + b-- + b++ + b + --b + ++b b的值: -3 -4 -5 表达式的值:-4 -5 当前项的值: 总结: + 最后运算求和,使用的是当前项的值累加 + 前置时,当前项的值 = 表达式的值 + 后置时,当前项的值 = b的值 分析: /* 起初,b的值是-3 --b 先自减,再使用 当前项的值为:-4 表达式的值:-4 运算后b的值:-4 b-- 先使用,再自减 当前项的值为:-4 表达式的值:-5 运算后b的值:-5 b++ 先使用,再自增 当前项的值为:-5 表达式的值:-4 运算后b的值:-4 b 直接使用 当前项的值为:-4 表达式的值:-4 运算后b的值:-4 --b 先自减,再使用 当前项的值为:-5 表达式的值:-5 运算后b的值:-5 ++b 先自增,再使用 当前项的值为:-4 表达式的值:-4 运算后b的值:-4 结果是当前项的值相加:-4 + -4 + -5 + -4 + -5 +-4 = -26 */ 试试看: var a = 5 console.log(++a + a++ + a-- + a + a-- + --a); // 35
二元运算符
二元运算符有:数学运算符、赋值预算符、比较运算符、逻辑运算符
在进行运算时,会发生隐私类型转换
- 数学运算符 + - * / %
- 赋值预算符 = += -= *= /= %=
- 比较运算符 > < >= <= != !== == ===
- 逻辑运算符 && || !
数学运算符
// 数学运算符也叫算数运算符,因此都需要转为Number才能计算 /* 加法 [需要特别注意] 如果等式两边有一个为字符串,那么会发生隐式类型转换 将另一边也转为String类型,然后拼接,最后得到一个拼接后的字符串 其他数学运算符,均是将等式两边先转为Number类型,然后再计算 */ var a = 1 var b = '2' var c = a+b // 结果是 "12"
赋值运算符
在JS中,一个等号表示赋值,两个等号才表示等于
// 赋值运算符有:= += -= *= /= %= var a = 10 var b = a // 相当于是将a的值复制以一份给b 打印a、b的结果都是10 var a += m // 相当于 a = a+m -= *= /= %=类似,不再赘述
比较运算符
比较运算实际比较的是:两个变量的值,返回结果是布尔值
// 比较运算符有: > < >= <= != !== == === /* 简单数据类型的比较,比较的是变量的大小/值 所以会发生隐式类型转换,转为Number 复制数据类型的比较,比较的是两个变量保存的地址 而不是具体变量的内容,即使长得一样,后面有机会写个相应的文章 */ var a = 10 var b = 20 var c = a > b // false var m = 100 var n = "100" // 会隐式转换,将String转为Number console.log(m==n) // true /* [经典问题] == 与 === 的区别? * == 比较的是值(等于) * === 比较值与类型(全等/恒等) */ 举个例子: var a = 20 var b = 20 console.log(a==b) // 比较值:两个值都是20 true console.log(a===b) // 比较值与类型:类型都是Number 且 值都是20 true var m = 100 var n = "100" // 会隐式转换,将String转为Number console.log(m==n) // 比较值:两个值都是20 true console.log(m===n) // 比较值与类型:第一个类型是Number,第二个类型是String 即使最后值相同,也是 false
逻辑运算符
逻辑运算符两边结果是布尔值,返回结果也是布尔值
- && 表示并且,需要两个同时满足,返回 true
- || 表示且,只要有一个满足,就返回true
- ! 表示非,就是取反的意思,如果为true 则返回 false,反之亦然
// 逻辑运算符有:&& || ! 1<2 && 3>4 // true && false 结果是 false 1==1 || 3==4 // true || false 结果是 true var flag = true console.log(!flag) // false
三元运算符
三元运算符也叫"三目运算符",功能类似if···else···
语法:条件 ? 条件1 : 条件2
// 条件 ? 条件1(条件满足/为true时执行) : 条件2(条件不满足/为true时执行) var age = 16 console.log(age<18?'未成年':'成年'); // 未成年
总结
使用 Number() String() Boolean() parseInt() parseFloat() 进行转换属于"强制类型转换",也叫"显示类型转换"。
使用 运算符进行计算时,中间会出现"隐式类型转换"。
【自己总结的,难免出错,仅供参考】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了