一篇搞懂 toString()函数与valueOf()函数

开发 前端
引用类型在转化为number的时候,首先会判断对象是否含有valueOf函数,如果有,那就调用valueOf函数,把它的返回值转为数字,然后返回;如果没有valueOf函数,就调用toString函数,将返回值转为数字并返回。如果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 函数:

  1. Array 的 toString 函数返回值是以逗号分隔的字符串;
  2. Function 的 toString 函数返回值是函数自身的文本定义;
  3. Date 的 toString 函数返回值是时间字符串;

valueOf()

valueOf 函数返回引用类型的原始值,如果没有原始值,就返回"{}",就是空对象的字面量

  1. Array的valueOf函数返回的值数组本身;
  2. Function的valueOf函数返回的是函数本身;
  3. Date的valueOf函数返回的值时间戳。

在发生数据类型转换的时候,有liang两种场景:

  1. 引用数据类型转为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函数,它的返回值也是一个空数组,也不能转为字符串,那就只能抛出类型转换异常了。

  1. 引用类型在转化为number的时候,首先会判断对象是否含有valueOf函数,如果有,那就调用valueOf函数,把它的返回值转为数字,然后返回;如果没有valueOf函数,就调用toString函数,将返回值转为数字并返回。如果toString或者valueOf都不能获取到原始值的话,那就抛出类型转换异常。
责任编辑:武晓燕 来源: 读心悦
相关推荐

2022-04-12 08:30:52

回调函数代码调试

2021-01-29 18:41:16

JavaScript函数语法

2021-08-06 17:47:46

Kotin高阶函数函数

2021-12-01 11:33:21

函数Min

2022-07-06 08:17:50

C 语言函数选型

2021-05-15 10:16:14

Python匿名函数

2024-04-17 13:21:02

Python匿名函数

2021-03-24 10:00:32

Python递归函数Python基础

2021-04-24 10:19:41

Python函数指向

2023-06-15 10:11:08

JavaScript函数表达式

2019-08-13 15:36:57

限流算法令牌桶

2020-06-03 11:06:26

DNS域名缓存

2019-07-09 14:17:28

Linux内存管理进程

2021-05-21 09:01:29

JavaScript 前端函数闭包

2021-03-06 10:05:03

Python函数变量

2021-05-27 07:12:19

Python函数装饰器

2022-07-06 12:07:06

Python函数式编程

2020-10-17 08:48:12

搞懂“智能联接”

2020-11-06 10:01:06

Nginx

2015-06-25 09:49:25

JavaScript隐式调用
点赞
收藏

51CTO技术栈公众号