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
基本数据类型
基础数据类型会返回自己原始的值,null
和undefined
是没有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 | 存储的时间是从1970 年1 月1 日午夜开始计的毫秒数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