一、前言

在等于运算符中,如果比较的内容包含对象类型数据,则会涉及隐式转换,那么就会调用toString()函数和valueOf()函数,下面我们将会了解到关于这两个函数的基本概念和使用场景。


二、toString() 函数

toString() 函数的作用是把一个逻辑值转换为字符串,并返回结果。

console.log((1).toString());//1
console.log((10).toString(2))//1010
console.log(("1").toString());//1
console.log((false).toString());//false
console.log(({p:1}).toString());//[object,object]
console.log((undefined).toString());//报错
console.log((null).toString());//报错
console.log((function(){}).toString());//function(){}
console.log([1,2,3,4].toString());//1,2,3,4
console.log((new Date()).toString())//Fri Jul 03 2020 17:20:11 GMT+0800 (中国标准时间)

在JavaScript中,Object,Array,Function,Date等类型都实现了自定义的toString()函数。

  • Object 类型数据的 toString() 函数默认的返回结果是 "[object Object]",当我们自定义新的类时,可以重写 toString() 函数,返回可读性更高的结果。
  • Array 的 toString() 函数返回值为以逗号分隔构成的数组成员字符串。数组也是对象,那么为什么数组返回的是对应的字符串而不是对象,其实数组覆盖了Object.toString方法,然后将连接数组并返回一个字符串,其中包含用逗号分隔的每个数组元素(相当于Array.join())
  • Function 的 toString() 函数返回值为函数的文本定义
  • Date 的 toString() 函数返回值为具有可读性的时间字符串

三、valueOf()函数

valueOf() 函数的作用是返回最适合引用类型的原始值,如果没有原始值,则会返回引用类型自身。

console.log((1).valueOf());//1
console.log((10).valueOf(2))//报错
console.log(("1").valueOf());//1
console.log((false).valueOf());//false
console.log(({p:1}).valueOf());//{p:1}
console.log((undefined).valueOf());//报错
console.log((null).valueOf());//报错
console.log((function(){}).valueOf());//function(){}
console.log([1,2,3,4].valueOf());//[1,2,3,4]
console.log((new Date()).valueOf());//1593767848260
  • Object 类型数据的valueOf()函数默认的返回结果是"{}",即一个空的对象字面量。
  • Array 的valueOf()函数返回的是数组本身
  • function 的valueOf()函数返回的是函数本身
  • Date 的valueOf()函数返回的是指定日期的时间戳

小结:

  • toString() 返回的是字符串,而 valueOf() 返回的是原始值,没有原始值返回对象本身
  • undefined 和 null 都没有 toString() 和 valueOf() 方法
  • Date 类型的 toString() 返回的表示时间的字符串;valueOf() 返回的是现在到1970年1月1日的毫秒数(时间戳)
  • Number 类型的 toString() 方法可以接收转换基数,返回不同进制的字符串形式的数值;而 valueOf()方 法无法接受转换基数

四、特殊情况

如果一个引用类型的值既存在 toString() 函数又存在 valueOf() 函数,那么在做隐式转换时,会调用哪个函数呢?这里我们可以概括成两种场景,分别是引用类型转换为 String 类型,以及引用类型转换为 Number 类型。

1、引用类型转换为 String 类型

一个引用类型的数据在转换为 String 类型时,一般是用于数据展示,转换时遵循以下规则:

  • 如果对象具有 toString() 函数,则会优先调用 toString() 函数。如果它返回的是一个原始值,则会直接将这个原始值转换为字符串表示,并返回该字符串。
  • 反之,则会再去调用 valueOf() 函数,如果 valueOf() 函数返回的结果是一个原始值,则会将这个结果转换为字符串表示,并返回该字符串。
  • 如果通过 toString() 函数或者 valueOf() 函数都无法获得一个原始值,则会直接抛出类型转换异常。

2、引用类型转换为 Number 类型

一个引用类型的数据在转换为 Number 类型时,一般是用于数据运算,转换时遵循以下规则:

  • 如果对象具有 valueOf() 函数,则会优先调用 valueOf() 函数,如果 valueOf() 函数返回一个原始值,则会直接将这个原始值转换为数字表示,并返回该数字。
  • 反之,则会再去调用 toString() 函数,如果 toString() 函数返回的结果是一个原始值,则会将这个结果转换为数字表示,并返回该数字。
  • 如果通过 toString() 函数或者 valueOf() 函数都无法获得一个原始值,则会直接抛出类型转换异常。

最新文章

  1. extern "c"用法解析
  2. sprint3冲刺第二天
  3. hdu 1008 注意同层情况
  4. [ACM_模拟] ZJUT OJ 1139 七龙珠 (追及类问题,s-t图像,模拟)
  5. Github教程(3)
  6. 正确使用 Volatile 变量——Brian Goetz
  7. 小记:利用递归调用循环寻找MP3文件的方法。
  8. Codevs 3231 小吃
  9. TortoiseSVN文件夹及文件图标不显示解决方法(转发)
  10. Hadoop学习之--Capaycity Scheduler源码分析
  11. iOS10全新推送功能的实现
  12. 让div 实现 input效果
  13. BaseAdapter的ArrayIndexOutOfBoundsException
  14. SpringMVC(一)——流程框架总体介绍
  15. Codeforces 85D Sum of Medians(线段树)
  16. hbase memstorelab
  17. js date相关学习!
  18. charles重复发送一个网络请求&同时发送N次
  19. 随手用JQ写个选项卡
  20. mysql中注释的添加修改

热门文章

  1. 阿里云ECS服务器(G5)安装配置docker
  2. 网络监听FTP明文口令实验
  3. 数据类型 Java day7
  4. ElasticSearch7.3 学习之定制动态映射(dynamic mapping)
  5. 数据库中间件ShardingSphere-Proxy(一)
  6. RPC框架 和 fegin原理
  7. String 和StringBuffer、StringBuilder的区别?
  8. JDBC 中文编码
  9. 讲一讲 kafka 的 ack 的三种机制 ?
  10. kafka指定partiton生产