Js中的对象转换为数值类型时是不是返回结果都是NaN?

打错了函数,sorry...

1、看到Js高程第三章Number()函数转换对象为数值时没看懂。
2、然后我尝试了一下用Number()函数转换对象为数值时,结果都是NaN。
3、所以如果有可以转换为数值类型的对象请举例,万分感谢解惑。

阅读 2.5k
3 个回答

你需要了解调用Number的时候,到底是怎么执行的?
根据js规范,如果参数是对象,会首先把对象转化为原始类型的数据,那么怎么转化为原始类型的数据呢?
比如

let a = {}

那么会首先调用avalueOf方法,如果结果不是原始类型,那么调用toString方法:
a.valueOf()返回对象本身,不是原始类型,所以需要继续调用toString方法;
a.toString()返回"[object Object]",是一个字符串,是原始类型,所以接下来会调用Number("[object Object]"),返回NaN;

所以你如果想返回数字,那个我们就可以通过修改转化步骤中的返回值来改变结果,比如,可以修改valueOf的返回值:

let a = {}
a.valueOf = function () {return 2}
Number(a) // 2

或者修改toString的返回值:

let b = {}
b.toString = function () {return 3}
Number(b) // 3

参考链接

  1. 规范

说 ES5.1,
Number 会对参数进行toNumber的操作, toNumber的返回值如下

undefined -> NaN
Null      -> +0
true      -> 1
false     -> +0
Number    -> argument
String    -> 根据字面量语法解析字符串为数字
Object    -> { var primValue = ToPrimitive(argument,"number"); 
               return toNumber(value);}

至于toPrimitive 我用 JS 实现一个给你看呗:http://zonxin.github.io/post/...

let flag = false;
Number(flag)
//0

let b = new Boolean(false);
b //Boolean {false}
Number(b)
//0

可以转换的,会自动包装与拆包(包装类型) 默认 false -> 0 , true -> 1

不知道你问的是不是这个?不是的话,可以截个图书上说的具体是啥,哪里没明白

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