// 重写对象的valueOf和toString方法var obj = {valueOf: function () {console.log('调用valueOf方法')return 1},toString: function () {console.log('调用toString方法')return 2},}var result = 1 + obj // 调用valueOf方法console.log(result) // 2// 只重写对象的valueOf方法var obj = {valueOf: function () {console.log('调用valueOf方法')return 1}}var result = 1 + obj // 调用valueOf方法console.log(result) // 2// 只重写对象的toString方法var obj = {toString: function () {console.log('调用toString方法')return 2},}var result = 1 + obj // 调用toString方法console.log(result) // 3前两种情况上一样的 , 说明一下第三种情况为什么是调用的toString方法:如果没有重写对象的valueOf方法 , 那么对象就会调用原型链上的valueOf方法 , 即Object.prototype对象中方法 , 这个方法默认返回的是对象本身 , 根据前面所说的转换规则 , 当调用valueOf方法的时候返回的是一个对象 , 会继续调用toString方法 , 看看是否返回原始类型的值 , 所以经过调用toString发现返回的是2 , 是一个原始类型 , 不再往下执行 , 所以会打印出3 , 1 + 2 = 3 , 再来看一下两个方法都返回对象是什么样的:
// 重写对象的valueOf和toString方法var obj = {valueOf: function () {console.log('调用valueOf方法')return {}},toString: function () {console.log('调用toString方法')return {}},}var result = 1 + objconsole.log(result)//执行结果如下:// 调用valueOf方法// 调用toString方法// Uncaught TypeError: Cannot convert object to primitive value// 先调用valueOf方法 , 后调用toString , 最后报错 , 印证了上面我们所说的结论:当两个方法都返回对象的时候 , 会报错最后说一下两个方法的调用情况:- valueOf偏向值运算 , 当有运算符的时候 , 会先调用此方法
- toString偏向显示 , 当用alert函数的时候 , 会先调用此方法
【Javascript中类型知识和valueOf和toString()方法】
推荐阅读
- 中国最优秀的中医药大学是什么?
- 八大金刚分别是谁 八大金刚是哪几位
- 时尚彩妆中化妆品的使用技巧有哪些
- 老树生茶开汤,2013年中茶普洱班章老树生茶新品上市
- 春季湿气过重女性当心美丽不再 4大健脾祛湿中药还你动力
- 伏羲诞生的启示 伏羲女娲神话故事
- 漫长的战斗:美国人眼中的朝鲜战争 美国人眼中的朝鲜战争pdf
- 新中国成立以来总共举行了多少次阅兵 新中国成立以来举行了多少次阅兵
- 古代十大冤案有哪十件案子 中国古代十大冤案有哪些?
- 渐解中华民族茶道之源,今古茶道茶艺
