js类型转换

2023-01-30  本文已影响0人  清平乐啊

该文章记于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上的valueOftoString两种方法
运算规则:

三、注意事项

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()方法一致
+(加)符号转换优先级顺序:

参考文献

JavaScript Type Conversions
JavaScript-Equality-Table
JavaScript type coercion explained
JavaScript Type Conversions Explained

……待完善

上一篇 下一篇

猜你喜欢

热点阅读