JavaScript 之所以会发生类型转换,是因为它是弱类型的语言。这使得JS中的变量数据不是固定的,会根据上下文自行发生改变。这种灵活性让开发人员能够更加快速地编写代码,但也带来了潜在的复杂性和意外。
类型概览
在ES5时期,JavaScript有5种原始数据类型(Number
、String
、Boolean
、Null
、Undefined
)和1种引用数据类型(Object
)。原始数据类型是拷贝式赋值,存储的是值本身;引用式数据类型是引用式赋值,存储的是指向值的指针。
基本数据类型之间的显示类型转换之Boolean
JS 的简单数据类型都有构造函数类型,在发生类型转换的时候会当成构造函数来用。Boolean() 是将任何类型的值转化成布尔类型(只有 ture
或 false
)的方法.如果没有传递任何参数或者传递特定"假值"(falsy values),它会返回 false
;剩下的都会返回 true
。来看些例子:
JavaScript
console.log(Boolean())// 默认值为false
console.log(Boolean(false))
console.log(Boolean(undefined))// false
console.log(Boolean(null))// false
console.log(Boolean(+0),'+0')/// false
console.log(Boolean(-0),'-0')// false
console.log(Boolean(NaN),'NaN')// false 非数字
console.log(Boolean(""),'""')// false
以上的输出结果都为 false
,不知道你有没有看迷糊。 我们来详细解析下:
- 第一个是没有提供任何参数,默认返回
false
。 - 第二个则是直接将假值
false
直接传递给Boolean
,当然是返回false
。 - 第三个中
undefined
是一种特殊值,表示变量未定义。在布尔上下文中,它是假值。 - 第四个中
null
表示空值或不存在的对象,在布尔上下文中也被视为假值。 - 第五和第六中的
+0
和-0
分别表示从正方向无限趋近于0和负方向无限趋近于0。在某些情况下会有所不同,但在这都表示假值。 - 第七个中
NaN
的意思是 "这不是一个数字"(Not-a-Number),是JavaScript中的特殊值。尽管它的类型是Number
,但在布尔中仍被视为假值。 - 第八个传入空字符串,在布尔上下文中被视为假值。而非空字符串则是真值。
Boolean()的转换小结
对于那些传入 false
、 undefined
、 null
、 +0
、 -0
、 NaN
和空字符串 ""
以及不传入参数的特殊情况,一律返回 false
,剩下的都是返回 true
。
基本数据类型之间的显示类型转换之Number
Number()和Boolean()类似,只不过Number()是将任何类型的值转换成数字。来看代码:
JavaScript
console.log(Number())// 0
console.log(Number(undefined))// NaN 未定义 无法转换 undefined 在数值上下文中没有转换成一个特定数字的含义
console.log(Number(null))// 0 定义了 为空
console.log(Number(false))// 0 在数值上下文中,false 被转换为0
console.log(Number(true))// 1
console.log(Number('123')) // 123
console.log(Number('-123'))// -123
以上代码的输出结果中比较特别的一点是,为什么传入undefined
的返回值会是NaN
? 这是因为undefined
表示一个未赋值的状态,在数值上下文中没有明确的意义,所以Number(undefined)
返回 NaN
(Not-a-Number)。
除此之外,还有一些比较特别的存在:
JavaScript
console.log(Number('0x11'))// 17
console.log(Number(''),Number(""))// 0 0
console.log(Number('100a'))// 100
- 传入的字符串以
0x
开头时,JS会将其视为十六进制数值并进行转化计算。 - 当传入空字符串时,不管是
''
或""
,JS都会认为空字符串没有数值意义,默认转化成0。 - 传入像
100a
这种特别的字符串时,Number()会开始解析直到遇到第一个无法识别为数字的字符为止。但如果像a100
这种,它就会直接返回NaN
。
Number()的转换小结
- 未定义 (
undefined
) :转换为NaN
,因为undefined
在数值上下文中没有意义。 - 空值 (
null
) :转换为0
,表示"空"或"不存在"。 - 布尔值 :
false
转换为0
,true
转换为1
。 - 字符串 :如果字符串可以被解析为合法的数值,则转换为相应的数值;否则,转换为
NaN
。以'0x'
或'0X'
开头,则按照十六进制规则进行转换。而空字符串被转换为0
。 - 混合合法与非法字符的字符串 :
Number()
会尽可能多地解析合法的数字部分,一旦遇到非法字符即停止解析。如果开头就有非法字符,则返回NaN
。
基本数据类型间的显示类型转换之String
String()是将任意类型的值转换成字符串。话不多说,来看代码:
JavaScript
console.log(String())
console.log(String(undefined),typeof String(undefined)) //"undefined" "string"
console.log(String(null),typeof String(null)) //"null" "string"
console.log(String(+0),String(-0))//"0" "-0"
console.log(String(NaN)) //"NaN"
console.log(String(1)) //"1"
以上代码中比较特别的存在就是 0
和-0
。在大多数情况下会被认为是同一个数,但在JS中被String()转换时,会分别返回0
和-0
。这是因为在IEEE 754 浮点数标准,该标准明确规定了正零 (+0
) 和负零 (-0
) 的存在。
String()的转换小结
- 无参数 :返回空字符串
""
。 undefined
:转换为字符串"undefined"
。null
:转换为字符串"null"
。- 特殊数值 (
+0
,-0
,NaN
) :根据具体情况转换为相应的字符串表示。 - 普通数值:直接转换为对应的字符串表示。
通过以上对 Boolean()
、Number()
和String()
的类型转换进行简单介绍,想必对简单数据类型的类型转换有了一定了解。了解和掌握数据类型的转换,可以帮助我们更精确地控制他们的 JavaScript 程序,并写出更加健壮且易于维护的代码。
菜鸟创作不易,还望善良的大佬多点点赞。