tostring和valueof的理解和区别

**

1.valueOf

**

// 返回对象的值,默认情况下返回对象本身
var obj = new Object()
  
console.log(obj.valueOf());//返回Object
console.log(obj.valueOf()===obj);//返回true

//重写valueOf
obj.valueOf = function(){
	return 2;
}

console.log(1+obj); //返回3

**

2.toString

**

var a={a:1}
// 返回对象的字符串形式,默认情况下返回类型字符串 
console.log(a.toString());//返回[object Object]
console.log(a.toString() === a);//返回false

//重写toString
a.toString=function(){
	return 'wo'
}
console.log(a.toString())//返回wo

//数组调用toString,返回由数组中每个值的字符串形式拼接而成的一个以逗号分割的字符串
var arr = [1,2,3];
console.log(arr.toString());//返回1,2,3

//函数调用toString
console.log((function(){
	return 'wo'
}).toString());  //输出表达式function(){return 'wo'}


//日期类型调用toString
console.log(new Date().toString());//返回当前时间的描述Sun Jun 14 2020 12:45:14 GMT+0800 (中国标准时间)

**

toString Vs valueOf

**

在js中不同类型的数据可以互相进行比较运算。而在这个运算过程中,就需要使用toString和valueOf对数据进行处理。
调用规则
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

2、如果不定义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

共同点:在 JavaScript 中,toString()方法和valueOf()方法,在输出对象时会自动调用。
不同点:二者并存的情况下,在数值运算中,优先调用了valueOf,字符串运算中,优先调用了toString。

返回值类型的差别: toString vs valueOf的差别:

          1. toString一定将所有内容转为字符串

          2. valueOf取出对象内部的值,不进行类型转换

用途的差别:

          1. valueOf专用于算数计算和关系运算

          2. toString专用于输出字符串

共同的缺点:无法获取null和undefined的值

你可能感兴趣的:(javascript)