javascript是一门弱类型语言,不同的基础数据之间的运算自己会进行一个相关的类型转换,如常见的
var t = "test", b = t + 12 //"test12"

这些常见的类型转换比较熟悉,但是涉及到关于对象与原始值之间的运算,类型转换规则比较特殊

基础知识点:

var t = {a: 1, b: 2}
t.toString() //"[object Object]"
t.valueOf() //{a: 1, b: 2}即对象本身
var arr = [1,2,3,4]
arr.toString() //"1,2,3,4"类似arr.join(",")

对象均有toString,valueOf两个方法

转换规则:

对象->String

1:如果对象的toString方法存在,那么调用toString,若该对象返回的值为原始值,则将该原始值转换为字符串返回(若该值不为字符串的话)
2:如果对象的toString方法返回的不是原始值,且valueOf方法存在,调用valueOf方法,若该对象返回的值为原始值,则将该原始值转换为字符串返回(若该值不为字符串的话)
3:若对象的toString与valueOf方法返回的值均不为原始值,那么Throw TypeError的错误。

//规则1
function t(){
    return 1
}
console.log(t + 3) //"function t(){↵ return 1↵}3"
//修改toString方法
t.toString = function(){
    return "bbbbbb"
}
console.log(t + 3) //"bbbbbb3"

console.log(t.valueOf())
/*
function t(){
    return 1
}
*/
//不为原始值

//再次修改toString方法,使其返回的值不为原始值
t.toString = function(){
    return {a:1}
}

console.log(t + 3) // Uncaught TypeError: Cannot convert object to primitive value

//那么重写valueOf方法
t.valueOf = function(){
    return "dddddd"
}

console.log(t + 3) //"dddddd3"
//这时,再修改toString

t.toString = function(){
    return "3333dd"
}

console.log( t + 3 ) //"3333dd3"

    

对象->number

1:如果对象的valueOf方法存在,那么调用valueOf,若该对象返回的值为原始值,则将该原始值转换为数字返回(若该值不为数字的话)
2:如果对象的valueOf方法返回的不是原始值,且toString方法存在,调用toString方法,若该对象返回的值为原始值,则将该原始值转换为数字返回(若该值不为数字的话)
3:若对象的toString与valueOf方法返回的值均不为原始值,那么Throw TypeError的错误。

文献:javascript权威指南 类型转换章节

对象到number的具体代码跟对象到string的类似,只不过是方法的优先级变换了,跟规则是吻合的。



jiejiewu
13 声望0 粉丝