Javascript中类型知识和valueOf和toString()方法( 二 )

  • 如果valueOf和toString都返回是对象 , 则直接报错
  • 分几种情况来看一下:
    // 重写对象的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()方法】


    推荐阅读