数据类型转换
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。
对象的转换规则
对象的转换规则比较复杂。
-
先调用对象自身的valueOf方法,如果该方法返回原始类型的值(数值、字符串和布尔值),则直接对该值使用Number方法,不再进行后续步骤。
-
如果valueOf方法返回复合类型的值,再调用对象自身的toString方法,如果toString方法返回原始类型的值,则对该值使用Number方法,不再进行后续步骤。
-
如果toString方法返回的是复合类型的值,则报错。
String函数:强制转换成字符串
使用String函数,可以将任意类型的值转化成字符串。规则如下:
原始类型值的转换规则
-
数值:转为相应的字符串。
-
字符串:转换后还是原来的值。
-
布尔值:true转为“true”,false转为“false”。
-
undefined:转为“undefined”。
-
null:转为“null”。
对象的转换规则
如果要将对象转为字符串,则是采用以下步骤。
-
先调用toString方法,如果toString方法返回的是原始类型的值,则对该值使用String方法,不再进行以下步骤。
-
如果toString方法返回的是复合类型的值,再调用valueOf方法,如果valueOf方法返回的是原始类型的值,则对该值使用String方法,不再进行以下步骤。
-
如果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()判断
浙公网安备 33010602011771号