js中用Number函数对对象进行数值转换时的问题

最近正在研究红宝书,在数值转换这里发现了一个问题,关于Number函数的。
书上是这么说的:
clipboard.png

然后我就这个说法在console里面写了个test,代码如下:

var obj = {
    valueOf:function(){
        return "abcd";
    },
    
    toString:function(){
        return 123;
    }
};
Number(obj);

以及返回的结果:

clipboard.png

然后问题来了,为什么返回的是NaN?按照书上说的,先调用对象的valueOf()
方法,将方法返回的值进行数值转换,然后判断结果,如果是NaN则会继续调用对象的toSting()方法,再将方法返回的值进行数值转换,得到最终结果应该是123。但是最后返回的不是123而是NaN,这是为什么,是因为这个obj只是一个简单对象吗?还是我这个例子没写对-_-!
向各位大佬请教!!

阅读 3k
4 个回答
var obj = {
    
    toString:function(){
        return 123;
    }
};
Number(obj)

这才是你想要的效果
书上说的很清楚,如果是对象,调用valueof之后,你返回的是字符串,按照之前字符串处理,结果是NaN。
上面那个是对象,但是没定义valueof所以是NaN,之后调用toString

var obj = {
    valueOf:function(){
        console.log(1)
        return "abcd";
    },
    
    toString:function(){
        console.log(2)
        return 123;
    }
};
Number(obj);

运行上面的程序就可以知道,并没有运行对象的toString方法。
你可以对比下原文和翻译看看差别在那。

If that conversion results in NaN, the toString() method is called and the rules for converting strings are applied.

应该是翻译的问题,建议你多找几本书对照着看一下。其次,这个问题没有什么实际应用场景,所以研究价值不大。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题