toString 和valueOf区别

1.首先要说明的是这两种方法是toPrimitive抽象操作里会经常用到的。

默认情况下,执行这个抽象操作时会先执行valueOf方法,如果返回的不是原始值,会继续执行toString方法,如果返回的还不是原始值,那么会报错,如果有指定转换类型时,情况又会有所不同,详细解析请继续往下看。

(注意:valueOf和toString方法在Date,array等对象中有些是被重写过的,所以不同对象调用此方法可能产生的操作不同,如果没有这些方法,会调用最原始的Object.prototype上的valueOf和toString方法)

2. 这两个方法 (转换方法)

toString(): 是返回一个反映这个对象的字符串

valueOf(): 是返回它相应的原始值

对象 返回值
Array 数组没有valueOf方法,继承的是Object.prototype.valueOf的原始方法,返回数组本身
Boolean Boolean 值
Date 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC
Function 函数没有valueOf方法,继承的是Object.prototype.valueOf的原始方法,返回函数本身
Number 数字值
Object 默认返回对象本身
String 字符串值

 

 

 

 

 

 

 

 

 

 

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

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

2.如果对象没有toString()方法,或者这个方法并不返回一个原始值,那么js将调用valueOf()方法。

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

 

对象到数字的转换过程中,js做了同样类似的事情,但这里它会首先尝试使用valueOf()方法:

1.如果对象具有valueOf()方法,后者返回一个原始值,则js将这个原始值转换成数字,并返回这个数字。

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

(首先js转换成相应的字符串原始值,再继续将这个原始值转换成相应的数字类型,再返回数字)

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

你可能感兴趣的:(js)