将写作当成趣味,并始终进行上来。已经这是个小小的奢望,当初曾经在逐渐的实现中。
长话短说,既然是技术文,就不发这么多感叹了,接下来,一起进入明天的正题吧。
明天给大家分享的是 JavaScript
中的隐式类型转换问题。置信很多的小伙伴都曾被它困扰过,不论是开发中还是面试过程中。冀望明天的分享能给你带来不一样的了解。也能让你之后不再为此懊恼。
1. 根本数据类型
咱们都晓得,在 javascript
中一共有 7 中数据类型。别离是 Object, Null, Undefined, String, Number, Boolean, Symbol
。这些货色咱们在平时的开发过程中每天无时无刻不在接触,这里咱们不多赘述。
2. 强制类型转换
平时的应用过程中,咱们会遇到很多数据类型不统一的问题,同样,强制将不同的数据类型转换为雷同的数据类型也是很失常的操作;接下来,咱们看看都有什么样的强制转换方法:
2.1 字符串 -> 数字
1. parseInt
parseInt('123') // 123parseInt('123abc') // 123parseInt('12.3abc') // 12parseInt('abc123') // NaN
解释:
此办法只转换 以数字结尾的,直到不是数字,而后转换完结,如果字符串不是以数字结尾,则转换为 NaN
2. parseFloat
parseFloat('123') // 123parseFloat('12.3abc') // 12.3parseFloat('1.2.3abc') // 1.2parseFloat('abc1.23') // NaN
解释:
规定同 parseInt
,只是留神小数点的转换,只能转换一个小数点,如果是多个小数点,则只保留一个。
3. Number
Number('123') // 123Number('12.3abc') // NaNNumber('1.2.3abc') // NaNNumber('abc1.23') // NaN
解释:
此办法只转换 全数字 的字符串,如果字符串不是全数字。如'12.3abc','1.2.3abc','abc1.23'…………
的状况,对立转换为 NaN
4. 位运算
位运算的应用在前端是特地少的,以至于很多前端人员不分明具体应用。上面咱们来看看,如何应用位运算将字符串转换为数字
次要有以下几种操作形式可做转换
~
非<<
左移>>
右移
对于位运算的理论运算形式咱们暂不做形容,本次只看如何应用它们将字符串转为数字
~~'123' // 123 (这里是两个 ~~ 波浪线)'123' << 0 // 123'123' >> 0 // 123
解释:
应用办法跟 Number
雷同。都是只能转换全数字的字符串。不为全数字的字符串,~
转换为 NaN
,另外两种转换为 0
2.2 数字 -> 字符串
1. 应用 +
运算符。
'' + 123 // '123'
2. 应用 toString
办法
let num = 123num.toString() // ‘123’
3. 应用 String
办法
let num = 123String(num) // '123'
2.3 转换为布尔值
1. !! 办法。(双重否定即为必定。应用双重非能够失去原始值转换的布尔值)
let num = 123!!num // truelet str = '123'!!str // true
2. Boolean
办法
let num = 123let str = '123'Boolean(123) // trueBoolean('123') // true
留神:
JavaScript
中为 false
的状况:
'',""
空字符串0
数字0
undefined
null
NaN
false
3. 隐式类型转换
3.1 可触发隐式类型转换的操作
- 四则运算
+, -, *, /
比拟
> < >= <= ==
。- 留神:
===
是不会触发隐式类型转换的。
- 留神:
- 判断
if, while
3.2 toString
和 valueOf
阐明
此两种办法是将简单数据类型转换为原始值输入。
1. 调用 valueOf
办法后
String, Number, Boolean
返回的别离是 字符串值,数字值,布尔值。Object, Array, Function
返回的是本身Date
返回的是从开始到当初的毫秒值
2. 调用 toString
办法后
String, Number, Boolean
返回的本别是字符串类型的值Object
返回的是[object Object]
Array
返回的是 空字符串。因为在Array
中重写了这个办法function
返回的是函数自身的字符串Date
返回的是工夫,并非毫秒数
留神:
在获取原始值(toPrimitive)时,会先调用 valueOf
办法,如果返回的不是原始值(也就是说返回的不是根本数据类型),则会持续调用 toString
办法。如果还不是原始值。则会报错。
3.3 具体实例解析
请在查看解析之前尝试解答下方问题
// 数组[] == ![] // 1[] == [] // 2[] == false // 3[] == true // 4[1] == 1 // 5[] == 0 // 6[12] < [13] // 7// 对象{} == {} // 8{} == !{} // 9{} != {} // 10// 联合版[] + {} // 11{} + [] // 12{} + {} // 13[] + [] // 14{} + 1 // 151 + {} // 16
答案来咯,筹备好了没
1. [] == ![]
执行步骤
// 将原题中的 ![] 转换为原始值 --> ![] 为false[] == false// 将 [] 转换为原始值 [].valueOf() 返回本身,持续调用 toString 返回 空字符串'' == false// 将空字符串转换为 布尔值,空字符串为falsefalse == false// 失去后果为 [] == ![] --> true
2. [] == []
比拟的是地址,两个数组的地址不雷同。后果为false
3. [] == false
解答步骤同第一题[] == ![]
4. [] == true
解答步骤同第一题[] == ![]
5. [1] == 1
// 将 [1] 获取原始值, 调用 valueOf 返回本身,持续调用 toString 返回 '1'1 == 1// 失去后果 [1] == 1 --> true
6. [] == 0
// 将 [] 获取原始值, 调用 valueOf 返回本身,持续调用 toString 返回 ‘’‘’ == 0// 将空字符串转换为数字 '' --> 00 == 0// 失去后果 [] == 0 --> true
7. [12] < [13]
// 将左右都转换为原始值'12' < '13'// 失去后果 true
8. {} == {}
同 [] == []
9. {} == !{}
同 [] == ![]
不同的是,这里的 {}
转化为字符串之后为[object Object]
。 所以后果与 [] == ![]
相同
10. {} !== {}
同 {} == {}
反后果
11. [] + {}
// 将左右同时获取原始值。'' + '[object Object]' = '[object Object]'
12. {} + []
如果左边的值不值一个字典格局,则会将大括号当成一个空块儿解决。也就是说此时的表达式能够被转换成如下表达式+ []
,而后将 []
先转为空串,而后转换为数字,失去数字0
。
所以: {} + [] == 0
13. {} + {}
左右两边都做对象解决,获取原始值
'[object Object]' + '[object Object]' = '[object Object][object Object]'
14. [] + []
获取左右的原始值,都转换为了空字符串。而后做字符串拼接
'' + '' = ''
15. {} + 1
同 {} + []
,可变形为 + 1
16. 1 + {}
将右方的 {}
获取原始值,失去 '[object Object]'
,原式可变形为
1 + '[object Object]' = '1[object Object]'
4. 补充点
NaN
与任何值都不相等,包含它自身(这得多很,本人跟本人都不相等)- 有
undefined
参加的任意一个四则运算,后果都为NaN
- 布尔值
true
转数字时,转为1
;false
转为数字时为0
- 字符串之间比拟大小,理论比拟的是字符编码。如:
a > A = 97 > 65 = true
好了,明天的文章就分享到这儿咯,并没有写太多的概念,只是让大家来多看下理论运行的后果。一通则百通,通晓了理论运行的过程,再遇到类似的问题就熟能生巧了。