valueOf和toString的区别
基本上所有的JavaScript数据类型都有valueOf(),toString()方法,null除外,这两个方法解决了JavaScript值运算和显示的问题
valueOf()会把数据类型转换成原始类型,也就是说原来是什么类型,转换后还是什么类型,日期类型除外
toString()会把数据类型转换成string类型,也就是说不管原来是什么类型,转换后一律是string类型
这两个方法有意思的地方在于什么时候使用,总结如下:
1、valueOf()偏向于运算,toString()偏向于显示
2、对象转换时,优先调用toString()
3、强转字符串的情况下,优先调用toString()方法;强转数字的情况下优先调用valueOf()
4、正常情况下,优先调用toString()
5、在有运算操作符的情况下valueOf()的优先级高于toString(),这里需要注意的是当调用valueOf()方法无法运算后还是会再调用toString()方法
下面来看个案例:
var a = { a : 10 , toString : function(){ console.log("tostring"); return this.a } }; alert(+a); //10 tostring,先调用valueOf()方法,发现无法进行+运算,紧接着调用toString()方法
var b= {a:2,valueOf:function(){return this.a+2}}; alert(+b) //4 ,先调用valueOf()方法,返回4,可以进行运算,不再调用toString()
var b= {a:2,valueOf:function(){return this.a+2},toString : function(){ console.log("tostring"); return this.a }}; alert(+b) //4 ,先调用valueOf()方法,返回4,可以进行运算,不再调用toString(),从输出上可以看出没有调用toString()方法
JavaScript各种数据对象调用valueOf,toString返回值也是个容易出错的地方,下面做个总结:
调用valueOf()
对象 | 返回值 | 类型 |
Array | 数组本身 | Array |
Boolean | Boolean 值。 | Boolean |
Date | 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。 | Number |
Function | 函数本身。 | Function |
Number | 数字值。 | Number |
Object | 对象本身。这是默认情况。 | Object |
String | 字符串 | String |
调用toString()
对象 | 返回值 | 类型 |
Array | 数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起。其操作与 Array.toString 和 Array.join 方法相同。 | String |
Boolean | 字符串“true”,“false” | String |
Date | 字符串日期,如"Fri Dec 23 2016 11:24:47 GMT+0800 (中国标准时间)" | String |
Function | 函数字符串 | String |
Number | 字符串形式值 | String |
Object | "[object Object]" | String |
String | 字符串 | String |
参考资料:
http://www.jb51.net/article/34843.htm 想看案例的可以看看这个