JS中的 toString 和 valueOf 方法

所有的对象都继承了这两个方法,toString()valueOf()

toString

顾名思义,toString()就是将一个对象转化为字符串类型,默认的toString()方法会输出以下结果:

类型
原始数据类型返回一个字符串
普通对象返回 “[object Object]”
数组返回数组元素之间添加逗号合并成的字符串
函数返回函数的定义式的字符串
日期对象返回一个可读的日期和时间字符串
正则返回其字面量表达式构成的字符串
let str = "string"
str.toString()   ⇒   "string"

let obj = {a: 1}
obj.toString()"[object Object]"

let arr = [1, 2];
arr.toString()   ⇒   "1,2"

let fun = function(){}
fun.toString()   ⇒   "function(){}"

let date = new Date;
date.toString()"Mon Dec 02 2019 20:41:41 GMT+0800 (中国标准时间)"

let reg = /[0-9]/
reg.toString()"/[0-9]/"

valueOf

类型
日期对象返回自1970年1月1日到现在的毫秒数
其他类型均返回对象本身
str.valueOf()   ⇒     "string"
obj.valueOf()   ⇒     {a: 1}
arr.valueOf()   ⇒     (2) [1, 2]
fun.valueOf()   ⇒     ƒ (){}
date.valueOf()  ⇒     1575290501797
reg.valueOf()   ⇒     /[0-9]/

我们知道,js是一门弱类型语言,有一个很鲜明的特点在于,不同类型的数据可以互相进行比较运算。而在这个运算过程中,就是需要使用toStringvalueOf对数据进行处理。

调用规则

  1. 如果定义了valueOf,并且valueOf返回一个原始数据类型,大多数情况下优先调用valueOf
let obj = {
	a: 1
}
obj.toString = () => 10
obj.valueOf = () => 100

console.log(1 + obj); // 101
console.log('hello' + obj); // hello100
console.log(+obj); // 100
  1. 如果不定义valueOf(或者valueOf返回的不是原始数据类型),并且定义了toString(且toString返回一个原始数据类型),调用toString
let obj = {
    a: 1
}
obj.toString = () => 10
    // obj.valueOf = () => 100
console.log(1 + obj); // 11
console.log('hello' + obj); // hello10
console.log(+obj); // 10
let obj = {
    a: 1
}
obj.toString = () => 10
obj.valueOf = () => {
    return {
        a: 1
    }
}
console.log(1 + obj); // 11
console.log('hello' + obj); // hello10
console.log(+obj); // 10
  1. 如果将toStringvalueOf方法都设置为null,或者都没有返回原始数据类型,报错
let obj = {
    a: 1
}
obj.toString = null
obj.valueOf = null

console.log(1 + obj);
console.log('hello' + obj);
console.log(+obj);
//   Uncaught TypeError

特殊情况

  1. Date对象,默认先调用toString方法
  2. String()Number()的强制转化:
    String()方法会优先调用toString方法,Number会优先调用valueOf方法
    如果Number中的经过valueOf转化得到的值不是number类型,会输出NaN
  3. alertjoin
    使用alert输出,会优先调用toString方法
    alert就算没有重定义toString方法,也会调用默认的toString方法;
    可以通过将objtoString设为null来调用valueOf方法
    而数组中如果存在引用数据类型,在调用数组的join方法时,会先调用引用数据的toString方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值