该文章记于2023年1月06日
一、基本类型转换(Number,String,Boolean)
1.Number,parseInt,parseFloat,Math.floor,Math.ceil,一元运算符+,(>,<,<=,>=),(|,&,^,~),(==,!=)
+'2' //2
+true // 1
+null // 0
+undefined // NaN
+NaN // NaN
+{} // NaN
+'' // 0
+' ' // 0
+[] // 0
Number() // 0
2.String,toString,toFixed(),toExponential(),toPrecision()
String能将null和undefined转换成字符串形式,toString则报错
用例图片1
String({}) // [object Object]
String([]) // '' //空串
String() // ''
String('') // ''
3.Boolean,!,||,&&
False:空串,数字0,null,undefined,NaN
True:symbol,有一个空格的字符串,字符串0,字符串false,数字1,字面量{}/[]
字符串:除了空串,其他字符串转换成布尔值都是true
数字:除了数字0,其他数字布尔值为true
!转换成相反的布尔值
注:||和&&转换布尔值,最终返回的是原值而不是bool值
let x = 'hello' && 123; // x === 123
二、对象类型转换
任何非基本类型值总是转换成true
对象值转换成数字或字符串有专用内置属性[[ToPrimitive]]
对象值转换主要使用定义在Object.prototype
上的valueOf
和toString
两种方法
运算规则:
- 1.输入值本就是基本类型,不转换,直接返回;
- 2.调佣
toString()
方法,结果是基本类型,返回; - 3.调用
valueOf()
,结果是基本类型,返回; - 4.
toString()
和valueOf()
都无法得到基本类型值,抛出错误TypeError
注:数值先调用valueOf()
,返回值再调用toString()
;字符串则相反先toString()
再valueOf()
大多数内置类型没有valueOf()
方法,因此转换成数值和转换成字符串最后都是调用toString()
ToPrimitive
三、注意事项
1.特殊类型
(1)symbol
symbol只能显示转换,不支持隐式转换,隐式转换会报错:TypeError
symbol无法转换成数字,抛出TypeError错误
(2)字符串-->数字
引擎都会先去除字符串起始和末尾的空白,比如\n
\t
,去除空表后,字符串无法转换成数字时,则返回NaN
2.特殊规则
(1)null,undefined,==
null/undefined只与null和undefined等,且==两边操作数不转换成数字
20=='20' // 字符串20转成数字20
false=='' // 空串转换成布尔值为false
当==两个操作数都是字符串时,操作数都不转换成数字
==转换数组为数值时,数组先执行valueOf()
,返回数组本身,再执行toString()
,相当于执行数组的join()
方法,将数组拼接成字符串
(2)NaN
NaN不与任何值等
(3)+(加),>,+(一元操作符)
+(加)运算顺序是从左到右
+(加)将字面量[]
转成空串''
数组和对象的valueOf()
方法返回对象本身,因此被忽略
“number” + 15 + 3
--> "number15" + 3
--> "number153"
[] + null + 1
--> '' + null + 1
--> 'null' + 1
--> 'null1'
{}+[]+{}+[1]
// +所有操作数都是非基本类型,第一个{}处理成块声明语句,不是声明对象的字面量,因此第一个{}被忽略,不转换
--> +[]+{}+[1]
--> 0 + {} + [1]
--> 0 + '[object Object]' + [1]
--> '0[object Object]' + [1]
--> '0[object Object]' + '1'
--> '0[object Object]1'
[1] > null
--> '1' > 0
--> 1 > 0
--> true
"foo" + + "bar"
--> "foo" + (+"bar")
--> "foo" + NaN
--> "fooNaN"
(new Date(0)).valueOf() // 0
四、其他
除null和undefined外,所有值都有toString()
方法,结果与String()
方法一致
+(加)符号转换优先级顺序:
- 1.操作数都是非基本类型,使用
[ToPrimitive]
转换成基本类型 - 2.其中一个操作数是string(字符串),另一个操作数转换成字符串进行运算
- 3.以上都不是,俩操作数都转成数字进行运算
参考文献
JavaScript Type Conversions
JavaScript-Equality-Table
JavaScript type coercion explained
JavaScript Type Conversions Explained
……待完善
网友评论