由于JavaScript是一种弱类型特性语言,定义变量的时候无需指定变量类型。因为在运算过程中会存在隐式转换。
常见的隐式转换场景
我们经常在开发过程中遇到如下场景:
- if判断中
if(XXX){
...
}
这里就发生了隐式转换,我们知道if的判断条件是Boolean类型,代码在执行到if判断时,js将XXX转换成了boolean类型。
- 加号"+" 与 减号 “-”
var num= 1 + 2 + '3'
console.log(mum); //'33'
var m = 3 - true
console.log(m); //2
可以看出有些情况下+用作加号操作符,有些时候+作为字符串连接符,true被转换为 number类型,值为1,相减后得到2。
- .点号操作符
var a = 8;
console.log(a.toString()); // '8';
var b = 'jack';
console.log(b.valueOf()); //'jack';
在对数字,字符串进行点操作调用方法时,默认将数字,字符串转成对象。
- 关系运算符比较时
3 > 4 // false
"2" > 10 // false
"2" > "10" // true
如果比较运算符两边都是数字类型,则直接比较大小。如果是非数值进行比较时,则会将其转换为数字然后在比较,如果符号两侧的值都是字符串时,不会将其转换为数字进行比较,而是分别比较字符串中字符的Unicode编码。
String,Boolean,Number,对象之间的相互转换
- 其他类型转为字符串类型
- null:转为"null"。
- undefined:转为"undefined"。
- Boolean:true转为"true",false转为"false"。
- Number:11转为"11",科学计数法11e20转为"1.1e+21"。
- 数组:空数组[]转为空字符串"",如果数组中的元素有null或者undefined,同样当做空字符串处理,[1,2,3,4]转为"1,2,3,4",相当于调用数组的join方法,将各元素用逗号","拼接起来。
- 函数:function a(){}转为字符串是"function a(){}"。
- 一般对象:相当于调用对象的toString()方法,返回的是"[object,object]"。
String(null) // "null"
String(undefined) // "undefined"
String(true) // "true"
String(false) // "false"
String(11) // "11"
String(11e20) // "1.1e+21"
String([]) // ""
String([1,null,2,undefined,3]) // 1,,2,,3
String(function a(){}) // "function a(){}"
String({}) // "[object,object]"
String({name:'jack'}) // "[object,object]"
- 其他类型转为Boolean类型
只有null,undefined,0,false,NaN,空字符串这6种情况转为布尔值结果为false,其余全部为true,例子如下
Boolean(null) // false
Boolean(undefined) // false
Boolean(0) // false
Boolean(false) // false
Boolean("false") // true
Boolean(NaN) // false
Boolean("") // false
Boolean([]) // true
Boolean({}) // true
- 其他类型转为Number类型
Number(null) // 0
Number(undefined) //NaN
Number(true) //1
Number(false) //0
Number("11") //11
Number("1.1e+21") //1.1e+21
Number("abc") //NaN
Number([]) // 0
Number([0]) // 0
Number([1]) // 1
Number(["abc"]) NaN
Number({}) // NaN
相等(==)的隐式转换
- 字符串类型与数字类型相比较
- 当字符串类型与数字类型相比较时,字符串类型会被转换为数字类型
- 当字符串是由纯数字组成的字符串时,转换成对应的数字,字符串为空时转换为0,其余的都转换为NaN
"1" == 1 //true
"" == 0 //true
"1.1e+21" == 1.1e+21 //true
"Infinity" == Infinity //true
NaN == NaN //false 因为NaN与任何值都不相等,包括自己
- 布尔类型与其他类型相比较
- 只要布尔类型参与比较,该布尔类型就会率先被转成数字类型
-布尔类型true转为1,false转为``0
true == 1 // true
false == 0 // true
true == 2 // false
"" == false // true
"1" == true // true
本文深入探讨JavaScript中常见的隐式类型转换场景,包括if判断、算术运算、点操作符使用、关系运算符比较及各类数据类型间的相互转换。通过实例说明,帮助读者理解JS的弱类型特性和其带来的潜在问题。
435

被折叠的 条评论
为什么被折叠?



