数据类型转换

javascript中一共有5种原始类型+对象类型

number、string、boolean、null、undefined

Object类型:Function、Array、Date...

其中隐含了很多类型转换的逻辑

比如:

"32"+32==="3232";
"32"-32===0;

或者使用num-0,num+""进行数字与字符串相互转化(不推荐)。

 

强制转换

强制转换主要指使用Number、String和Boolean三个构造函数,手动将各种类型的值,转换成数字、字符串或者布尔值。

 

Number函数:强制转换成数值

使用Number函数,可以将任意类型的值转化成数字。

原始类型值的转换规则

  • 数值:转换后还是原来的值。

  • 字符串:如果可以被解析为数值,则转换为相应的数值,否则得到NaN。空字符串转为0。

  • 布尔值:true转成1,false转成0。

  • undefined:转成NaN。

  • null:转成0。

Number函数将字符串转为数值,要比parseInt函数严格很多。基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN。

 

对象的转换规则

对象的转换规则比较复杂。

  1. 先调用对象自身的valueOf方法,如果该方法返回原始类型的值(数值、字符串和布尔值),则直接对该值使用Number方法,不再进行后续步骤。

  2. 如果valueOf方法返回复合类型的值,再调用对象自身的toString方法,如果toString方法返回原始类型的值,则对该值使用Number方法,不再进行后续步骤。

  3. 如果toString方法返回的是复合类型的值,则报错。

 

String函数:强制转换成字符串

使用String函数,可以将任意类型的值转化成字符串。规则如下:

原始类型值的转换规则

  • 数值:转为相应的字符串。

  • 字符串:转换后还是原来的值。

  • 布尔值:true转为“true”,false转为“false”。

  • undefined:转为“undefined”。

  • null:转为“null”。

 

对象的转换规则

如果要将对象转为字符串,则是采用以下步骤。

  1. 先调用toString方法,如果toString方法返回的是原始类型的值,则对该值使用String方法,不再进行以下步骤。

  2. 如果toString方法返回的是复合类型的值,再调用valueOf方法,如果valueOf方法返回的是原始类型的值,则对该值使用String方法,不再进行以下步骤。

  3. 如果valueOf方法返回的是复合类型的值,则报错。

String方法的这种过程正好与Number方法相反。

总结:valueOf偏向于运算,toString偏向于显示。valueOf方法返回包装对象实例对应的原始类型的值。

1、 在进行对象转换时(例如:alert(a)),将优先调用toString方法,如若没有重写toString将调用valueOf方法,如果两方法都不没有重写,但按Object的toString输出。 2、 在进行强转字符串类型时将优先调用toString方法,强转为数字时优先调用valueOf。 3、 在有运算操作符的情况下,valueOf的优先级高于toString。

 

Boolean函数:强制转换成布尔值

使用Boolean函数,可以将任意类型的变量转为布尔值。

原始类型值和对象的转换方法

以下五个值的转化结果为false,其他的值全部为true(包括false的包装类型)。

  • undefined
  • null
  • 0
  • NaN
  • ''(空字符串)

 

相等和严格相等

JavaScript有两个表示"相等"的运算符:"相等"(==)和"严格相等"(===)。

因为"相等"运算符会自动转换变量类型,造成很多意想不到的情况:

 

0 == ''// true
1 == true // true
2 == true // false
0 == '0' // true
false == 'false' // false
false == '0' // true
" \t\r\n " == 0 // true

再比如

Object==基本类型//拆箱后比较

boolean==?//转化为1、0后再比较

 

建议不要使用"相等"(==)运算符,只使用"严格相等"(===)运算符。

===先判断类型、基本类型值相等、对象比较引用,特别地:

null===null;
undefined===undefined;
null!==undefined
NaN!==NaN//用isNaN()判断

 

posted on 2015-11-03 15:47  cbwleft  阅读(161)  评论(0)    收藏  举报