时间:2025-06-12 09:29
人气:
作者:admin
vlaueOf()以及toString():
一个引用类型的数据在转换为String类型时,一般是用于数据展示,转换时遵循以下规则。· 如果对象具有toString()函数,则会优先调用toString()函数。如果它返回的是一个原始值,则会直接将这个原始值转换为字符串表示,并返回该字符串。· 如果对象没有toString()函数,或者toString()函数返回的不是一个原始值,则会再去调用valueOf()函数,如果valueOf()函数返回的结果是一个原始值,则会将这个结果转换为字符串表示,并返回该字符串。· 如果通过toString()函数或者valueOf()函数都无法获得一个原始值,则会直接抛出类型转换异常。
var arr = [];
arr.toString = function () {
console.log('执行了toString()函数');
return [];
};
arr.valueOf = function () {
console.log('执行了valueOf()函数');
return [];
};
console.log(String(arr));
执行结果:
执行了toString()函数
执行了valueOf()函数
TypeError: Cannot convert Object to primitive value
执行String(arr)代码时,需要将arr转换为字符串,则会优先执行toString()函数,但是其返回值为空数组[],并不能转换为原生数据;然后调用valueOf()函数,其返回值同样为空数组[];那么在调用完toString()函数和valueOf()函数后,均无法获取到原生数据类型表示,则抛出异常TypeError,表示无法将对象类型转换为原生数据类型
一个引用类型的数据在转换为Number类型时,一般是用于数据运算,转换时遵循以下规则。· 如果对象具有valueOf()函数,则会优先调用valueOf()函数,如果valueOf()函数返回一个原始值,则会直接将这个原始值转换为数字表示,并返回该数字。· 如果对象没有valueOf()函数,或者valueOf()函数返回的不是原生数据类型,则会再去调用toString()函数,如果toString()函数返回的结果是一个原始值,则会将这个结果转换为数字表示,并返回该数字。· 如果通过toString()函数或者valueOf()函数都无法获得一个原始值,则会直接抛出类型转换异常。我们通过以下代码进行测试。
var arr = [];
arr.toString = function () {
console.log('执行了toString()函数');
return [];
};
arr.valueOf = function () {
console.log('执行了valueOf()函数');
return [];
};
console.log(Number(arr));
执行结果:
执行了valueOf()函数
执行了toString()函数
TypeError: Cannot convert Object to primitive value
执行Number(arr)代码时,需要将arr转换为数字,则会优先执行valueOf()函数,但是其返回值为空数组[],并不能转换为原生数据;然后调用toString()函数,其返回值同样为空数组[];那么在调用完valueOf()函数和toString()函数后,均无法获取到原生数据表示,则抛出异常TypeError,表示无法将对象类型转换为原生数据类型。事实上,对除了Date类型以外的引用类型数据转换为原生数据类型时,如果是用于数据运算,则会优先调用valueOf()函数,在valueOf()函数无法满足条件时,则会继续调用toString()函数,如果toString()函数也无法满足条件,则会抛出类型转换异常。如果是用于数据展示,则会优先调用toString()函数,在toString()函数无法满足条件时,则会继续调用valueOf()函数,如果valueOf()函数也无法满足条件,则会抛出类型转换异常。
备注:摘自于书籍:《Javasript 重难点实例精讲》