Contents

以前看到这个题目顶多会想一下,不就是调用一下toString(),然后就没有下文了,所以这就是会感觉不踏实,感觉提升不大。但是我通过观看大牛的博客发现他们都有一种精神想的很全面————刨根问底。
然后我最近又看了一遍犀牛书,来成长一下我刨根问底的精神。

对象到原始值的转化无非两种情况:

  • 对象到字符串
  • 对象到数字

javascript中对象到字符串的转换经过了如下这些步骤:
如果对象具有toString方法,则调用这个方法。如果它返回一个原始值,javascript将这个值转换为字符串,并返回这个字符串结果。需要注意的是,原始值到字符串的转换在下表中已经有了详细说明。
如果对象没有toString方法,或者这个方法并不返回一个原始值,那么javascript会调用valueOf方法。如果存在这个方法,则javascript调用它。如果返回值是原始值,javascript将这个值转换为字符串,并返回这个字符串结果。
否则,javascript无法从toString和valueOf获得一个原始值,因此这时抛出一个类型错误异常。
javascript中对象到数字的转换经过了如下这些步骤:
如果对象具有valueOf方法,后者返回一个原始值,则javascript将这个原始值转换为数字(如果需要的话)并返回这个数字。
否则,如果对象具有toString方法,后者返回一个原始值,则javascript将其转换为数字类型并返回。(见示例)
否则,javascript抛出一个类型异常。

什么意思呢?有什么用呢?
比如空数组转化为数字会是0,因为数组继承了默认的valueOf()方法。
然后再举个例子,在运算符+和==中,如果其中有个操作符是对象会怎么样,好先不急,我们来看看+运算符的规则

  • 如果操作符数中有一个对象,它将转换为原始值(string、number或boolean)
  • 如果操作符数中有一个字符串,第二个操作数将转换成字符串,并且连接在一起转换成一个字符串
  • 在其它情况之下,两个操作数转换为数字并且将执行加法运算
    详见链接
    然后就是我接下来要说的如果其中有个对象,犀牛书上的话我看了半天没看懂,后来终于看懂了,归根结底是我对+号的不了解以及我前面的化没看懂。

在+ or ==中除了日起对象,都是对象到数字的转化过程

1
2
3
4
5
var r={};
r.valueOf=function(){
return 3;
}
console.log(3+r);//6

那日期是什么样了,看下面代码:

1
2
3
4
var date=new Date();
console.log(date.valueOf());//1470484509871
console.log(date+4);//Sat Aug 06 2016 19:56:43 GMT+0800 (中国标准时间)4

上面代码如果按照我上面说的,最后打印的就是1470484509875,可不是这个,原因是日期对象是预设对象,是对象转化为字符串的过程。

那我不经有有个疑问如果操作符一个是对象一个是日期对象会怎么样,同理日期对象依旧按对象转变为字符串的过程,而正常对象安转变为数字的过程,这个告诉我们对象转为原始值在+中跟操作数无关,跟操作符有关。

1
2
3
4
5
6
7
8
9
10
11
12
13
var date=new Date();
var r={};
r.valueOf=function(){
return 3;
};
r.toString=function(){
return 4;
}
console.log(3+r);//6
console.log(date.valueOf());//1470484509871
console.log(r+date);//3Sat Aug 06 2016 19:56:43 GMT+0800 (中国标准时间)
console.log(date+r);//Sat Aug 06 2016 19:56:43 GMT+0800 (中国标准时间)3

Contents