js中的类型转换

下表来自js权威指南

js中的类型转换


总结一下上面的表:

1.原始值到原始值可以转换比较好理解,需要注意的是undefined转化为数字的时候是NaN。那些以数字表示的字符串可以直接转换为数字,也允许在开始和结尾处带有空格。

2.原始值到对象也比较好理解。调用String() Number() Boolean()构造函数,转化为各自的包装对象,注意null和undefinded没有包装对象所以会抛出错误

3.对象到原始值,这个就比较复杂了,下面文会做详细介绍


显示类型转换

除了null和undefined之外的任何值都具有toString()方法,这个方法的执行结果通常和String()方法的返回结果一致。

注意: 如果试图把null或undefined转换为对象,则会抛出一个类型错误,但是Object()函数在这种情况下不会抛出错误异常,它仅仅简单地返回创建的空对象。

在js中某些运算符会做隐式类型转换:

如果+运算符的一个操作数是字符串,它将会把另一个操作数转换为字符串。

一元+运算符将其操作数转换为数字。

一元!运算符将其操作数转换为布尔值并取反


Number转化为字符串:

1.toString() 可以接受转换基数的可选参数,如果不指定此参数,转换将基于十进制

2.toFixed()根据小数点后的指定位数将数字转换为字符串,它从不使用指数计数法

3.toExponential()使用指数计数法将数字转换为指数的字符串,其中小数点前只有一位,小数点后的位数由参数决定

4.toPrecision()根据指定的有效数字将数字转换为字符串,如果有效数字的位数少于数字整数部分的位数,则转换为指数形式

字符串转化为数字

1.如果Number()转换函数传入一个字符串,他会试图将其转换为一个整数或浮点数直接量,这个方法只能基于十进制进行转换,并且不能出现非法尾随字符

2.parseInt()函数只解析整数,前缀是0x或者0X将解释为十六进制数,可以指定转换基数

3.parseFloat()可以解析整数和浮点数

parseInt()和parseFloat()都会跳过任意数量的前导空格,尽可能多的解析更多的数值字符,并忽略后面的内容。


对象转换为原始值

对象到布尔值的转换非常简单:所有对象(包括数组和函数)都转换为true.

对象转换到字符串和对象转换到数字比较麻烦,下面说的转换规则只适合本地对象,宿主对象(例如web浏览器定义的对象)根据各自的算法可以转换成字符和数字。

所有的对象继承了两个转换方法toString()和value()


默认的toString()方法返回值:

数组类:将每个元素转换为一个字符串,并在元素之间添加逗号后合并成结果字符串

函数类:通常返回用户定义的函数转换为js源代码字符串

日期类:返回一个可读的日期和时间字符串

RegExp类:正则表达式直接量的字符串


valueOf()方法:如果存在任意原始值,它就默认将对象转化为原始值

默认的valueOf()方法简单地返回对象本身,而不是返回一个原始值。数组、函数、正则表达式简单地继承了这个默认的方法。日期定义的valueOf()方法会返回它的一个内部表示:1970年1月1日以来的毫秒数


重点来了!!!!!!!!!!!!!

js中对象到字符串的转换经过了如下步骤:

1.如果对象具有toString()方法则调用这个方法。如果它返回一个原始值,js将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果。

2.如果对象没有toString()方法,或者这个方法并不返回一个原始值,那么js会调用valueOf()方法。如果存在这个方法,则js调用它。如果返回值是原始值,js将这个值转换为字符串(如果不是字符串本身的话),并返回这个字符串结果。

3.否则,js无法从toString()或valueOf()获得一个原始值,因此这时它将抛出一个类型错误。


在对象到数字的时候,js做了同样的事情,只是他会首先尝试使用valueOf()方法:

1.如果对象具有valueOf()方法,后者返回一个原始值,则js将这个原始值转为数字(如果需要的话),并返回这个数字

2.否则,如果对象具有toString()方法,后者返回一个原始值,则js将其转换并返回

3.否则,js抛出一个类型错误异常


从上面的转换规则我们可以知道为什么空数组会转换为0:首先数组继承了默认的valueOf()方法,这个方法返回数组本身,因此调用toString()方法,空数组转换为空字符串,空字符串转换为0.


对于所有非日期的对象来说,对象到原始值得转换基本上是对象到数字的转换,日期对象则使用到字符串的转换模式,然而这里的转换和上文讲述的转换并不一致。通过valueOf()或toString()返回的原始值将直接使用,而不会强制转换为数字或者字符串。


和==一样,"<"运算符以及其他关系运算符也会做对象到原始值得转换,但要除去日期对象的特殊情形:任何对象都会首先调用valueOf()然后调用toString().


+  ==   !=  以及关系运算符是唯一要执行这种特殊的字符串到原始值的转换方式的运算符。其他运算符的转换都很明确,而且对日期也没有特殊情况。例如“-”运算符把两个操作数都转换为数字。