JavaScript类型转换方法及需要注意的问题小结(挺全面)

  一、类型转换的方法和应该注意的问题:

  1.转换为布尔型:

  1)用两次非运算(!):

  !!5 ==> true

  2)用布尔型的构造函数:

  new Boolean(5) == > true

  值转换为布尔类型为false

  0+0-0NaN""(空字符串),undefined,null

  除上面的值其他值在转换以后为true,需要特别提到的是:

  "0",new Object(),function(){}

  2.转换为字符串类型:

  1)加上空字符串""

  123 + "" = "123"

  2)用字符串构造函数:

  new String(123) = "123".

  需要特别注意的转化:

  +0 ==> "0"

  -0 ==> "0"

  -Infinity ==>"-Infinity"

  +Infinity ==>"+Infinity"

  NaN ==> "NaN"

  undefined ==> "undefined"

  null ==> "null"

  new Object() ==> "[object Object]"

  function(){} ==> "function(){}"

  3.转换为数值型:

  1 取正(+), 减零 -0), 乘一,(*1),除以一(/1),取负(-,这个得到相反的值)。

  +"123" = 123

  +true = 1

  2)用构造函数Number();

  new Number("123") = 123

  几个需要特别注意的转化:

  ""(空字符串) ==> 0

  "010" ==> 10

  "0x10"(16进制) ==> 16

  "-010" ==> -10

  "-0x10" ==> NaN

  undefined ==> NaN

  null ==> 0

  true ==> 1

  false ==> 0

  new Object() ==> NaN

  new function(){} ==> NaN

  二、隐式类型转换:

  (1)二元加法运算(+):如果两个操作数中有一个是String类型,将把两个操作数转换为String类型再相加。

  如果两个操作数中没有字符串类型,那么将把两个操作数转换为数值类型再做运算。

  举例:

  "123"+123 = "123123";

  123+123 = 246

  true + true = 2

  true + undefined = NaN (因为undefined转换为数值为NaN,所有结果为NaN)

  true + null = 1 (null转换为数字是0)

  "123" + null = "123null" (包含字符串将转化为字符串相加)

  "123" + undefined = "123undefined" undefined同样适用)

  1 + 2 + "123" = "3123" (1+2是首先按照数值型计算的)

  (2)二元减乘除运算(-*/):因为只有数值类型才有 - * / 运算,所以会先将两个操作数转换为数值型再做运算。

  "123"-123 = 0

  (3)一元取正(+),取负运算符(-):取正或者取负都是针对数值型的运算,所以会将操作数转换为数值型再做运算。

  +"123" = 123

  -"123" = -123

  +"123e" = NaN

  +"123f" = NaN

  +"123e-2" = 1.23

  (4)一元非(!)运算符:非运算符需要将操作数转化为布尔类型。

  !"123" = false

  !!"123" = true

  !123 = false

  !!123 = true

  (5)逻辑运算符(&&)和(||):

  &&或者||的两侧被判断的时候会被转为布尔类型进行判断,

  但是我在测试的时候却发现一个有趣的事情。

  &&运算符:如果有一个项为false,那么表达式返回false,如果所有的项都不为false,那么表达式返回最右边一个项的原始值。

  举例:

  123 && 23 && 45 返回 45,而不是我们想象中的true.

  所以如果有 123 && 23 == true 那么应该是false

  至于if(123 && 23) 认为是true那应该是把23转换为布尔类型了。

  ||运算符:

   || 测试的结果也和我想象的不一样,|| 返回第一个转换以后不为false的值,如果都为false,它将返回最后一个为false的值(未进行类型转化之前的值)。

  举例: 

  123 || 23 返回 123,而不是想象中的true.

  false || null 返回null 而不是想象中的false

  三、类型转换函数

  1.parseFloat转换为浮点数:

  字符解析函数获取每一个字符直到遇到不属于数值的字符,然后返回它已获取的数值.

  几个需要特别注意的:

  ""(空字符串) ==> NaN

  "123e-2" == > 1.23 (科学计算法是可以识别的)

  "010" ==> 10 (8进制不能识别)

  "0x10"==> 0 (16进制不识别)

  "-010" ==> -10

  null,undefined,true,false,new Object(),function(){} ==> NaN

  2.parseInt转换为有符号整数:

  parseFloat相似,但是他会把小数位舍掉(注意不是四舍五入,是完全舍弃,跟Math.floor处理方式一样),而且他可以识别八进制和16进制表示方式:

  123e-2 == > 1

  "123e-2" ==> 123

  "010" == > 8

  "0x10" ==> 16

  "-010" == > -8

  "-0x10" ==> -16

  null,undefined,true,false,new Object(),function(){},-Infinity +Infinity NaN ==> NaN

  3.三个取整函数的区别

  1Math.ceil():“天花板,很形象吧?就是取大于等于参数的最小整数。

  8.7 == > 9

  -8.7==> -8

  2Math.floor():"地板",取小于等于参数的最小整数。

  8.7 ==> 8

  -8.7 ==> -9

  3Math.round():"四舍五入"取整数。