js中toString()与valueOf()的使用
tostring 和 valueOf 函数是解决值的显示和运算的问题。所有的 Object 类型的数据都自带 toString 和 valueOf 函数。
比如我们定一个 Object 类型数据:
const obj = { name: "duxin" } console.log(obj.valueOf()); // { name: 'duxin' }
toString()
toString 函数的作用是把一个逻辑转换为字符串,并且返回 Object 类型数据的 toString()默认的返回值"[object Object]"。
如果我们在定义对象的时候,可以重写 tosString 函数,这样 toString 的返回值可读性会更好一些,比如:
const obj = { name: "duxin", toString:function(){ return this.name; } } console.log(obj.valueOf()); // { name: 'duxin' } console.log(obj.toString()); // duxin
以下这些函数都是有自定义的 toString 函数:
- Array 的 toString 函数返回值是以逗号分隔的字符串;
- Function 的 toString 函数返回值是函数自身的文本定义;
- Date 的 toString 函数返回值是时间字符串;
在JavaScript中,Object,Array,Function,Date等类型都实现了自定义的toString()函数。
- Object 类型数据的 toString() 函数默认的返回结果是 “[object Object]”,当我们自定义新的类时,可以重写 toString() 函数,返回可读性更高的结果。
- Array 的 toString() 函数返回值为以逗号分隔构成的数组成员字符串。数组也是对象,那么为什么数组返回的是对应的字符串而不是对象,其实数组覆盖了Object.toString方法,然后将连接数组并返回一个字符串,其中包含用逗号分隔的每个数组元素(相当于Array.join())
- Function 的 toString() 函数返回值为函数的文本定义
- Date 的 toString() 函数返回值为具有可读性的时间字符串
valueOf()
valueOf 函数返回引用类型的原始值,如果没有原始值,就返回"{}",就是空对象的字面量。
- Array的valueOf函数返回的值数组本身;
- Function的valueOf函数返回的是函数本身;
- Date的valueOf函数返回的值时间戳。
在发生数据类型转换的时候,有liang两种场景:
引用数据类型转为String,先是调用toString函数,有值的话,就直接返回该字符串;如果对象没有toString,那就调用valueOf函数,然后将原始值转为字符串并且返回;如果toString或者valueOf都不能获取原始值,那就抛出类型转换异常;
var arr = []; arr.toString = function () { console.log('调用了toString()函数'); return []; }; arr.valueOf = function () { console.log('调用了valueOf()函数'); return []; }; console.log(String(arr));
在执行String(arr)的时候,是先将数组转为字符串,调用的是toString,它的结果不能转为string;
那就调用valueOf函数,它的返回值也是一个空数组,也不能转为字符串,那就只能抛出类型转换异常了。
引用类型在转化为number的时候,首先会判断对象是否含有valueOf函数,如果有,那就调用valueOf函数,把它的返回值转为数字,然后返回;如果没有valueOf函数,就调用toString函数,将返回值转为数字并返回。如果toString或者valueOf都不能获取到原始值的话,那就抛出类型转换异常。
- 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() 函数都无法获得一个原始值,则会直接抛出类型转换异常。
到此这篇关于js中toString()与valueOf()的使用的文章就介绍到这了,更多相关js toString() valueOf()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
最新评论