Front-end developmenter必看,超实用的javaScript隐式类型转换规则记忆技巧。

xuesong 2019-06-28

javaScript类型转换规则

javaScript的类型转换其实一直是很多前端开发人员很迷的地方,一会儿这里要转换,一会儿那里又要转换,总之就是一个大写的迷,因为它隐式类型转换的地方实在是太多了。

但其实它还是有规律可寻的,只要记忆一些基本的转换规则并掌握这些规律,就能很好的理清楚javaScript隐式类型转换什么时候发生以及它进行怎样的转换。

下面先看看涉及到的几个函数以及他们的转换规则,这个是需要记忆的内容

类型转换需要使用到的函数

  • 对于布尔值,用到的是Boolean()
  • 对于数值,用到的是Number(),当然还有parseInt()、parseFloat(),但是对于隐式类型转换的时候,调用的是前者。
  • 对于字符串,用到的是toString()、String()

Boolean()

对于不同的数据类型,转换规则不一样

  1. Boolean类型: true -> true, false -> false
  2. String类型: 任何非空字符 -> true, 空字符 -> false
  3. Number类型: 任何非零数字(包括无穷大) -> true, 0和NaN -> false
  4. Object类型: 任何对象啊 -> true, null(特殊的对象,实质是是Object的派生) -> false
  5. Udefined类型: 始终为转换为false

Number()

  1. Boolean类型: true -> 1, false -> 0
  2. Number类型: 只是简单的传入和传出
  3. null: 返回0
  4. Udefined类型: 返回NaN
  5. 字符串类型:

    • 若字符串中只包含数字(包含正负号),则将其转换为十进制数,注意011 -> 11会忽略前面的0
    • 如果字符串中包含有效的浮点格式,如'1.1',则将其转换为对应的浮点数值(同样也会忽略前导零)
    • 如果字符串包含有效的十六进制格式,例如oxf,则将其转换为相同大小的十进制整数
    • 如果字符串是空的,转换为0
    • 如果字符串包含上述格式之外的字符,则将其转换为NaN
  6. 对象:先调用对象的valueOf()方法,然后依照前面列举的规则转换返回的值,如果转换的结果是NaN,再调用对象的toString()方法,也依照前面的规则转换返回的字符串值

toString()、String()

除了null、undefined,其他数据类型都含有toString()这个方法,直接调用即可,null、undefined可用String()来转换

以上规则来源于javaScript高级程序设计第三版

那什么时候进行隐式类型转换呢?

规则

只要你的数据类型和你使用的操作符所适用的数据类型不同时(除了相等操作符==、!=),就会调用前面提到的相应的类型转换方法来进行转换。
如果被转换类型是Object,那么会先调用自身的valueOf(),根据情况决定是否继续调用toString(),并将得到的值传入类型转换方法中。
如果是二元加性操作符(+),如果有一个值为字符串,那么结果始终为字符串。
如果是关系运算符<、<=、>、>=,对于两边都是字符串的情况,会比较两个字符串对应的字符编码,而不是将其转换为Number

数值类型操作符

一元操作符++、--,一元加减操作符+、-,位操作符~、&、|、^、<<、>>、>>>,乘性操作符*、/、%,加性操作符加法+、减法-,关系操作符<、>、<=、>=,它们都是对Number类型的值进行操作,如果发现类型不对,就会调用Number()来转换。

布尔操作符

对于操作布尔类型的操作符如!、&&、||,如果任意一边不是布尔值,则会调用Boolean()来转换。

相等操作符==、!=

对于相等操作符,它的类型转换就比较复杂了,我们上面的规则也不适用于它,这里还是列出来。
这个表展示的是对于不同类型的组合,是怎么转换的,并且将最终转换的结果使用全等===来比较。

Front-end developmenter必看,超实用的javaScript隐式类型转换规则记忆技巧。

结语

javaScript高级程序设计上说的很分散而且也很多,没有统一说明,让人很晕,上面是我总结出来的,中间有一个小地方我没指明,因为还没确认,因为个人觉得这是一个错误,该错误已上报给出版社,若确认是一个错误,那么我将不会在这里指出,否者我将把这个小知识点添加到本文结语后面部分。上面的数据类型转换概括的很全面,也很容易理解,希望对你有帮助。

总结来自javaScript高级程序设计第三版

相关推荐

greent00 / 0评论 2020-05-29