标签:
强制类型转换的概念相信大家一定不陌生,例如整数和浮点数进行算术运算,整数会在后台转型为浮点数。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={} 作为操作数有何不同?
这两个问题目前本人还不十分清楚,以后有时间会研究研究(如果有大神知道答案,请不吝赐教)。
标签:
原文地址:http://www.cnblogs.com/zhangjianhu/p/4559965.html