您的位置:首页 > Web前端 > JavaScript

由几道JS笔试题引发的知识点探究二——强制类型转换

2015-06-08 00:54 435 查看
  强制类型转换的概念相信大家一定不陌生,例如整数和浮点数进行算术运算,整数会在后台转型为浮点数。JS作为一门弱类型的动态脚本语言,任何两种数据类型之间都可以进行性转换而不会报错,这就带来了一整套错综复杂的类型转换规则。例如我们的题目 alert('5'+5),大家都知道答案是'55',但为什么这里不将string转换成number而要将number转换成string呢?在其他情况下也都要将string转型成number吗?下面我们就来做一次完整的总结。

  一、何时转型为boolean?

  1. 逻辑非操作符

  2. 条件操作符(?)

  3. if while for switch

  这三种情况下,如果操作数不是boolean类型的,都会在后台调用Boolean()方法,该方法对以下值返回true:

  对象(包括数组、函数,无论是不是空,都返回true)、非空字符串、非零数值(包括Infinity,但不包括NaN)

  相对应的,如下情况返回false

  空字符串、0、NaN、null、undefined

  二、何时转型为number?

  1. ++/--

  2. +/-(作为一元操作符)

  3. 位操作符(NaN和Infinite被当作0对待)

  4. * / 和 -

  5. 关系操作符(> < >= <=)

  6. 相等操作符(== !=)

  这六种情况下,如果操作数不(全)是number类型的话,会在后台调用Number()方法(注意不是parseInt()方法),该方法有如下规则:

  1. boolean值true和false分别转换为1和0

  2. null转换为0

  3. undefined转换为NaN

  4. 空字符串转换为0

  5. 对可识别的格式转换为相应数字(例如'1.1','012','0x1f'),否则转换为NaN(例如'1.2.3','12ab')

  6. 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。

  三、何时转型为string?

  1. +(二元操作符)

  当加法操作符的两个操作数中有一个是string类型的时候,就会调用另一个操作数(非string类型)的toString()方法(因为null和undefined没有toString()方法,因此会调用String()方法),然后连接两个字符串得到一个新字符串,下面直接用几个典型例子来说明:

-5.5+'5'  // '-5.55'
NaN + '5' // 'NaN5'
-Infinity+'5' // '-Inifnity5'
null + '5' // 'null5'
undefined + '5' // 'undefined5'
true + '5' // 'true5'
false + '5' // 'false5'
[1,2,3,4] + '5' // '1,2,3,45'
{} + '5' // '5'
{a:1} + '5' // '5'
{a:1, b:2} + '5' // 报错
var o = {}
o + '5' // '[object Object]5'


  上述例子大都很好理解,但最后几个关于对象的还存在疑问,主要有两点问题:

  1. 对象的toString()方法究竟做了什么?

  2. 直接将{}作为操作数和将o={} 作为操作数有何不同?

  这两个问题目前本人还不十分清楚,以后有时间会研究研究(如果有大神知道答案,请不吝赐教)。

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: