说明

所有的对象都继承有toString() 和 valueOf() 方法,对象到字符串,对象到数字的转换,会通过调用待转换对象的这两个方法中的一个来完成。

解释

toString( )方法的作用是:

返回一个反映这个对象的字符串,而很多类都定义了不同版本的toString( )。

({}.toString());       //=>  "[object Object]"
[1,2].toString(); //=> "1,2"
true.toString(); //=> "true"
new Date(1970,0,1).toString(); //=> "Thu Jan 01 1970 00:00:00 GMT+0800 (CST)" Error("一个错误信息").toString(); //=> "Error: 一个错误信息" (function (x){return x}).toString(); //=> "function (x){return x}" /\d/.toString(); //=> "/\\d/" 或者 "/\d/" 浏览器不同返回也可能会不同

valueOf() 方法,它的作用是:

如果对象存在任意原始值,它就默认将对象转换为表示它的原始值,如果对象是复合值,而且大多数对象无法真正表示为一个原始值,因此默认的valueOf( )方法简单地返回对象本身,而不是返回一个原始值。

数组、函数、和正则表达式简单的继承了这个默认方法,调用这些类型的实例的valueOf( )方法只是简答返回对象本身。

日期类定义的valueOf( )方法会返回它的一个内部表示:1970年1月1日以来的毫秒数。

[1,2].valueOf();  //=>  [1,2]  

(function (){}).valueOf();   //=>  function (){}

/\d/.valueOf();    //=>  /\d/  

new Date().valueOf();   //=>  1502941383029

原始值:不可变更的值,包括undefined、null、布尔值、数字、和字符串。
看下面这张图,列出了一些基本的类型转换,这张图来自 JavaScript权威指南。

好了,我们现在已经了解toString( )方法 和 valueOf( )方法了,下来我们来说说,对象到字符串和对象到数字的转换。

对象到字符串的转换:

1、如果对象具有toString( )方法,则调用这个方法。如果她返回一个原始值,JavaScript将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果。
2、如果对象没有toString( )方法,或者这个方法并不返回一个原始值,那么JavaScript会调用valueOf( )方法。如果存在这个方法,则JavaScript调用它。如果返回值是原始值,JavaScript将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果。
3、否则,JavaScript无法从toString()或者valueOf( )获得一个原始值,因此这时它将抛出一个类型错误异常。

对象到数字的转换:

1、如果对象具有valueOf( )方法,后者返回一个原始值,则JavaScript将这个原始值转换为数字(如果需要的话)并返回这个数字。
2、否则,如果对象具有toString( )方法,后者返回一个原始值,则JavaScript将其转化并返回。
3、否则,JavaScript抛出一个类型错误异常。

所以这就解释了,为什么空数组会被转换为数字0,为什么具有单个元素的数组同样会转换成一个数字。
数组继承了默认的valueOf( )方法,这个方法返回一个对象而不是一个原始值,因此,数组到数字的转换则调用toString( )方法。空数组转换为空字符串,空字符串转换为数字0。
含有一个元素的数组转换为字符串的结果和这个元素转换字符串的结果一样。
如果数组只包含一个数字元素,这个数字转换为字符串,在转换回数字。

JavaScript中的"+"运算符可以进行数学加法和字符串连接操作。如果它的其中一个操作数是对象,则JavaScript将使用特殊的方法将对象转换为原始值,而不是使用其他算术运算符的方法执行对象到数字的转换,"= ="相等运算符与此类似。如果将对象和一个原始值比较,则转换将会遵照对象到原始值的转换方式进行。

"+" 和 "= ="应用的对象到原始值的转换包含日期对象的一种特殊情形。日期类是JavaScript语言核心中唯一的预先定义类型,它定义了有意义的向字符串和数字类型的转换。
对于所有非日期的对象来说,对象到原始值的转换基本上是对象到数字的转换(首先调用valueOf( )),日期对象则使用对象到字符串的转换模式,然而,这里的转换和上文讲述的并不完全一致:通过valueOf( )或者toString( )返回的原始值将被直接使用,而不会被强制转换为数字或字符串。

和"= ="一样,"<"运算符以及其他关系运算符也会做对象到原始值的转换,但要除去日期对象的特殊情形:任何对象都会首先尝试调用valueOf( ),然后调用toString( )。不管得到的原始值是否直接使用,它都不会进一步被转换为数字或字符串。

总结

本文说了说 toString( )方法 和 valueOf( )方法的基础知识,文中的许多概念是出自JavaScript权威指南一书,大家可以多看看书。
如果这篇文章理解了,大家可以看看下面这两篇文章,相信你会知道更多有趣的事。
简单说 !![]==true 与 []==true 引发的思考
简单说 通过JS的隐式转换,关键时刻救你一命

简单说 JavaScript中的tostring( ) 与 valueOf( )方法的更多相关文章

  1. 区分javascript中的toString(),toLocaleString(),valueOf()方法

    首先我们随意创建一个对象,这很简单,打开FF浏览器的Firebug切换到控制台或者打开webkit浏览器的审查元素功能. 输入以下内容: var obj1=[1,2,3,4,5] var obj2=[ ...

  2. javascript中的toString()、toLocaleString()方法

    javascript中的toString()方法,主要用于Array.Boolean.Date.Error.Function.Number等对象.下面是这些方法的一些解析和简单应用,做个纪律,以作备忘 ...

  3. Java中区别.toString() ,(String),valueOf()方法

    在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object.toString(),(String)要转换的对象,St ...

  4. JS中的toString()和valueOf()方法

    1.toString()方法:主要用于Array.Boolean.Date.Error.Function.Number等对象转化为字符串形式.日期类的toString()方法返回一个可读的日期和字符串 ...

  5. JavaScript Array 对象方法 以及 如何区分javascript中的toString()、toLocaleString()、valueOf()方法

    1.concat() 2.join() 3.pop() 4.push() 5.reverse() 6.shift() 7.unshift() 8.slice() 9.sort() 10.splice( ...

  6. JavaScript引用类型之Array数组的toString()和valueof()方法的区别

    一.转换方法 1.在JavaScript中几乎所有对象都具有toLocaleString().toString和valueof()方法,因为,所有的对象都继承自Object,而前面所说的方法都是Obj ...

  7. javascript中的toString()方法

    javascript中的toString()方法,主要用于Array.Boolean.Date.Error.Function.Number等对象.下面是这些方法的一些解析和简单应用,做个纪律,以作备忘 ...

  8. javascript中的toString()

    基本介绍 javascript中的toString方法是我们在写前端时经常要用的一个函数,也就是将我们的变量转换成字符串的方法. javascript中各种类型的toString方法 javascri ...

  9. 一日一练-JS toString 和valueOf 方法的联系与区别

    子曰:类型转换中toString 和valueOf 的联系与区别分析 首先是看看ES5 的规范是如何进行说明的 在这里有几个基础知识点需要了解一下: [[Class]] [[Class]] 属于Obj ...

随机推荐

  1. SAP 配置表根据输入的值带出描述

    在SAP客制功能需求中,为了程式的灵活配置采用配置表的形成,使后期使用中不需要更改源代码实现功能的增加.在配置表的使用过程中,有时候会有这样的需求:在配置中输入或选择了编码,根据编码带出描述.以下详细 ...

  2. HDU 6126 Give out candies(网络流)

    题目给出n,m,k 然后给出n*m的矩阵a[i][j]代表第i个人在获得j 颗糖果能得到的满足值, 然后k是k行每行输入三个整数x,y,z     ,x,y,z表示一组限制表示第x个人分到的糖数减去第 ...

  3. PAT甲级——1012 The Best Rank

    PATA1012 The Best Rank To evaluate the performance of our first year CS majored students, we conside ...

  4. python之time模块和hashlib模块

    一.time模块 import time print(time.strftime('%Y-%m-%d %H:%M:%S'))#获取当前的格式化时间,time.strftime(format) prin ...

  5. 第一届“信安杯”部分WriteUp

    第一届"信安杯"部分WriteUp------OooooohLeeGay队! 小队成员(按姓氏):郭泽坤.李江川.赵乐祺 以下这部分是做出来的 2019.11.23-24 ++Re ...

  6. sql 日期表示

    今年时间 昨天,等于0表示今天 =month(时间对应列名) 上月

  7. 文件加密,密码加密,os模块

    序列化模块 (非常非常重要) 序列化:将一个数据结构(list,dict....)转化成一个特殊的序列(特殊的字符串)的过程. # l1 = [1, 2, 3] # ret = str(l1) # p ...

  8. mysql挖掘与探索------第2章 索引1-1

    1索引作用 说起提高数据库性能,索引是最物美价廉的东西了.不用加内存,不用改程序,不用调sql,只要执行个正确的’create index’,查询速度就可能提高百倍千倍,这可真有诱惑力.可是天下没有免 ...

  9. Vacant Seat(Atcoder-C-交互式题目)

    C - Vacant Seat Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement This i ...

  10. 文本快速分类利器fasttext使用心得(踩坑之路)

    fasttext是文本分类的一大利器,优点:快,嗷嗷快:缺点:暂未发现.但是我在使用其做文本分类时候还是遇到了挺多坑,今天先总结一个: 网上有人说设置训练参数的时候,ngrams设置大于2可以提高模型 ...