JS有一类知识,十分不友好,有许多的弯弯绕绕,存在复杂的情况,这便是类型转化。
前言
类型转换不仅仅是简单的数据变换,它更像是一门艺术——一种在灵活性与精确性之间寻求平衡的艺术。同时,它也是一门逻辑严密的学科,要求开发者对规则有着清晰的理解和准确的应用。
今天,我将带你解析其中的秘密,带你在各种基本类型中转转转!!!
🎭话不多说,先来个开胃小菜,让大家先热热身:
var a = "1"; // 字符串
console.log(typeof a); // "string"
a = Number("1"); // 转换为数字
console.log(typeof a); // "number"
a = true; // 转换为布尔值
console.log(typeof a); // "boolean"
这个案例由 字符串 => Number => boolean
,很好的体现JS是一门软类型语言,类型由值来决定这一特点。
🔄Boolean :true | flase
在Boolean中,存在9种情况为false:
console.log(Boolean()) // 默认值为false
console.log(Boolean(false))
console.log(Boolean(undefined))
console.log(Boolean(null))
console.log(Boolean(0))
console.log(Boolean(+0),'+0')
console.log(Boolean(-0),'-0')
console.log(Boolean(NaN),'NaN')
console.log(Boolean(''))
其他情况当是true了,非黑即白的道理
console.log(Boolean(true))
console.log(Boolean(1))
Number : NaN | Infinity
在介绍Number转换时,我想给大家讲清楚 NaN和Infinity的概念,以帮助大家更好的去理解
什么是Infinity ?
console.log(1/0+0) // Infinity 正无穷
console.log(1/-0) // -Infinity 负无穷
- 当你用
1
除以0
,JavaScript 返回Infinity
表示正无穷大。加上0
不会改变这个值,所以结果仍然是Infinity
。 - 负零(
-0
)是 JavaScript 中的一个特殊数值。当你用1
除以-0
,结果是负无穷大 (-Infinity
)。
什么是NaN?
它代表“不是一个数字”(Not-a-Number),尽管它的名字是“不是一个数字”,但在类型上,NaN
实际上属于 number
类型,这可能会让人感到困惑。
含义:
我们先来简单看看代码,其中的涉及到的隐式转换会在文章下篇中讲到。
console.log(1*'a') // NaN
简单理解这段代码的含义为:
- JavaScript 首先尝试将
'a'
转换为一个数字。 - 由于
'a'
不能被解析为一个有效的数字,无可奈何的情况下:它被转换为NaN
。 - 然后
1 * NaN
结果仍然是NaN
,因为任何数与NaN
进行算术运算的结果都是NaN
。
console.log(parseInt('123')) // 123
console.log(parseInt('aaa')) // NaN
此处的NaN,就感觉很有艺术性,像是JS把所有办法都试过了,都无法将'aaa' 转成数字,可它最终为了程序的运行,赋予它NaN,彷佛在告诉你哥们我真的努力了,没办法了。
特性:
- 自我不等性:
console.log(NaN === NaN) // false
NaN
不等于任何值,包括它自己。这意味着NaN === NaN
会返回false
。这是因为在 IEEE 754 浮点数标准中,NaN
被设计为与所有其他值都不相等,包括另一个NaN
。
- 传播性:
console.log( NaN+5)
- 在算术运算中,如果任何一个操作数是
NaN
,那么结果也会是NaN
。
- 类型检查:
console.log(typeof NaN)
- 使用
typeof
操作符来检查NaN
的类型会返回"number"
。这是因为它实际上是一个特殊的浮点数。
判断:
这时候可能长的帅的读者就要说了,那NaN有自我不等性,那如果我要检擦NaN的时候,怎么办呢? 不用担心,JS已经想你所想了。
// 不能通过===NaN来判断是否是NaN 所以会有isNaN
console.log(isNaN(NaN),isNaN(parseInt('aaa'))) // true
基本数据类型间的显示类型转换之Number:
规范介绍:
- 如果提供了
value
,则返回一个数值(不是一个Number
对象),该数值是由ToNumber(value)
计算得出的。 - 如果没有提供
value
,则返回+0
。
console.log(Number()) // 默认值为0
// NaN undefined 数值上下文中没有转成一个特定数字的含义
console.log(Number(undefined)) // NaN
console.log(Number(null)) // 0
console.log(Number(NaN)) // NaN
console.log(Number(false)) // 0
console.log(Number(true)) // 1
console.log(Number('123')) // 123
console.log(Number('-123')) // -123
// 16进制
console.log(Number('0x11')) // 17
console.log(Number(''),Number(' ')) // 0 0
console.log(Number('100a')) // NaN
重点分析一下 Null 和undifined ,也是有艺术的体现。展示了 JavaScript 在处理不同类型时的不同行为:
undefined
转换为数字时返回NaN
,因为undefined
是 JavaScript 中的一个原始值,表示一个未定义的变量或属性,但没有明确的数值意义。简单来说:就是undefined
是有值的,但是还没被定义,转不成Number
null
转换为数字时返回0
,因为null
在数值上下文中被视为“无”,即零。- 简单来说:就是
undefined
是有值的,但是还没被定义,转不成Number
,而null是个空值,数字中的空值对应的不就是0吗?
String
先看规范:
- 如果提供了
value
,则返回一个字符串值(不是一个字符串对象),该字符串值是由ToString(value)
计算得出的。 - 如果没有提供
value
,则返回空字符串""
。
基本数据类型间的显示类型转换之String
console.log(String()) // ''
console.log(String(undefined),typeof String(undefined)) // 'undefined'
console.log(String(null)) // 'null'
console.log(String(false)) // 'false'
console.log(String(true)) // 'true'
console.log(String(NaN)) // 'NaN'
console.log(String(+0),String(-0)) // '0' '0'
console.log(String(1)) // '1'
📚小结:
本文带大家了解了基本类型之间的转转转,还有基本=>复杂,复杂=> 基本,没给大家理清楚,预计在下文中推出, 如果本文对你有帮助,请留下一个小小的赞,若有错误,也请指教。