c 对象装html,js 对象转基本类型

本文深入探讨了JavaScript中对象转换为基本类型的过程,包括valueOf和toString方法的作用及调用时机,以及Symbol.toPrimitive属性的优先级。通过具体示例说明了不同情况下的转换行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对象转基本类型

对象在转换基本类型时,会调用 valueOf 和 toString,并且这两个方法你是可以重写的。

调用哪个方法,主要是要看这个对象倾向于转换为什么。如果倾向于转换为 Number 类型的,就优先调用 valueOf;如果倾向于转换为 String 类型,就只调用 toString

var obj = {

toString () {

console.log('toString')

return 'string'

},

valueOf () {

console.log('valueOf')

return 'value'

}

}

alert(obj) // string

console.log(1 + obj) // 1value

如果重写了 toString 方法,而没有重写 valueOf 方法,则会调用 toString 方法

var obj = {

toString () {

return 'string'

}

}

console.log(1 + obj) // 1string

调用上述两个方法的时候,需要 return 原始类型的值 (primitive value)

如果在调用 valueOf 的时候,返回的不是原始类型的值,就会去调用 toString

var obj = {

toString () {

console.log('toString')

return 'string'

},

valueOf () {

console.log('valueOf')

return {}

}

}

console.log(1 + obj)

// 依次打印出

valueOf

toString

1string

如果返回还不是原始的值,就会报错

var obj = {

toString () {

console.log('toString')

return {}

},

valueOf () {

console.log('valueOf')

return {}

}

}

console.log(1 + obj)

// 报错。无法将一个对象转换为原始类型的值

Uncaught TypeError: Cannot convert object to primitive value

如果有 Symbol.toPrimitive 属性的话,会优先调用,它的优先级最高

var obj = {

toString () {

console.log('toString')

return {}

},

valueOf () {

console.log('valueOf')

return {}

},

[Symbol.toPrimitive] () {

console.log('primitive')

return 'primi'

}

}

console.log(1 + obj) // 1primi

同样只能 return 原始类型的值,否则会报和上面所说一样的错。

var obj = {

toString () {

console.log('toString')

return {}

},

valueOf () {

console.log('valueOf')

return {}

},

[Symbol.toPrimitive] () {

console.log('primitive')

return {}

}

}

console.log(1 + obj)

// 报错

TypeError: Cannot convert object to primitive value

其他问题

var obj = {

toString () {

console.log('toString')

return '1'

},

valueOf () {

console.log('valueOf')

return 2

}

}

console.log(1 + obj)

console.log('1' + obj)

// 依次输出

valueOf

3

valueOf

12

按理来说

'1' + obj

这个 + 是倾向于转为转换为字符串类型的(也就是调用 toString);但是,它最后却是调用 valueOf。

原因在于,对于 + 这个操作符来说,本身就是代表加法,也就是说,本来就倾向于转为 number 类型,只不过发现加号左边出现字符串,于是乎把它的右边也转为字符串(也就是调用 valueOf 后,return 的值再转为字符串)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值