valueOf和toString的区别

49 阅读3分钟

valueOf和toString的区别

各类型的valueOf

返回当前对象的原始值。返回当前对象所对应的基本数据类型值

如果当前对象无法获取到对应的基本数据类型,那么会将对象本身原封不动的返回

复杂类型

Object实例的valueOf()方法将this值转化成对象。该方法旨在被派生对象重写,以实现自定义类型转化逻辑 基本的valueOf()返回this值本身:

const obj = {foo:1}
let arr = [1,2,3]
console.log(obj.valueOf() === obj) // true
console.log(obj.valueOf()) // {foo:1}
console.log(arr.valueOf()) // [1,2,3]

我们一般都对其进行重写:

function MyNumberType(n) {
  this.number = n;
}

MyNumberType.prototype.valueOf = function() {
  return this.number;
};

const object1 = new MyNumberType(4);

console.log(object1 + 3);
// Expected output: 7

基本数据类型

基础数据类型会返回自己原始的值,nullundefined是没有valueOf()方法的

var num = 1;

console.log(num.valueOf()); // 1

var s = "2"

console.log(s.valueOf()) // "2"

var boo = false

console.log(boo.valueOf()) // false

总结

对象返回值
Array返回数组对象本身。
Boolean布尔值。
Date存储的时间是从197011日午夜开始计的毫秒数UTC
Function函数本身。
Number数字值。
Object默认情况下返回对象本身。
String字符串值。

toString

Boolean类型的toString()

对于Boolean对象或者值,内置的toString方法返回字符串"true""false"

Number类型的toString()

Number对象的toString方法返回指定Number对象的字符串表示形式。其toString可以传递一个参数radix,这个参数的值的取值范围为[2,36],表示进行toString选择的进制,默认形况下选择10进制,如果radix的值不在[2,36],就出抛出异常

var count = 10;
console.log(count.toString()); // 输出 '10'
console.log((17).toString()); // 输出 '17'
console.log((17.2).toString()); // 输出 '17.2'
var x = 6;
console.log(x.toString(2)); // 输出 '110'
console.log((254).toString(16)); // 输出 'fe'

String类型的toString()

String类型的toString()方法返回指定对象的字符串形式。

const s = "hello"
console.log(s.toString()) // "hello"

Object类型的toString()

JavaScript通过调用toString方法返回一个表示该对象的字符串,每个对象都有一个toString方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString()方法被每个Object对象继承,如果此方法在自定义对象中未被覆盖,toString返回[object type],其中type是对象的类型。
JavaScript的许多内置对象都重写了该函数,以实现更适合自身的功能需要。因此不同类型对象的toString方法的返回值和返回值类型均可能不同。

function Dog(name) {
  this.name = name;
}

const dog1 = new Dog('Gabby');

Dog.prototype.toString = function dogToString() {
  return `${this.name}`;
};

console.log(dog1.toString());
// Expected output: "Gabby"

Array类型的toString()

toString()  方法返回一个字符串,表示指定的数组及其元素。

const arr1 = [1, 2, 'a', '1a'];
const arr2 = []

console.log(arr1.toString()); // Expected output: "1,2,a,1a"
console.log(arr2.toString()) // Expected output: ""

Array对象覆盖Object的toString方法。数组的toString方法实际上在内部调用了join()方法来拼接数组闭关返回一个包含所有数组的字符串,元素之间用逗号分隔。如果join不可用或者不是函数,则会使用Object.prototype.toString来代替,返回[Object Array]

valueOf和toString的优先级

  • 正常情况下,先调用toString
  • 当存在运算符时,优先调用valueOf
  • 当发现value运算不了时,还是会再次调用tostring