【问题标题】:.toFixed() called on negative exponential numbers returns a number, not a string对负指数数调用的 .toFixed() 返回一个数字,而不是字符串
【发布时间】:2016-04-19 14:55:36
【问题描述】:

我注意到,当针对负指数数调用 toFixed 时,结果是一个数字,而不是一个字符串。

首先,让我们看一下规格。

Number.prototype.toFixed (fractionDigits)

返回一个包含this Number valueString,以十进制定点表示法表示,小数点后有fractionDigits 位。如果 fractionDigitsundefined,则假定为 0

实际发生的是(在 Chrome、Firefox、Node.js 中测试):

> -3e5.toFixed()
-300000

所以,返回值为-3e5。另外,请注意这 不是 字符串。这是一个数字:

> x = -3e5.toFixed()
-300000
> typeof x
'number'

如果我将输入括在括号中,它会按预期工作:

> x = (-3e5).toFixed()
'-300000'
> typeof x
'string'

为什么会这样?有什么解释?

【问题讨论】:

  • 解析为-(3e5.toFixed())
  • 故事的寓意:对字面数字调用方法充满了危险。例如,5.toFixed() 是一个语法错误。使用括号或变量来避免陷入陷阱。 (你可以用5..toFixed()5.toFixed() 的事情,但是......不要这样做。Parens 很好而且可靠:(5).toFixed()。)
  • @T.J.Crowder 当然,我只是好奇发生了什么。 :-)

标签: javascript node.js tofixed


【解决方案1】:

我猜这是因为成员 ('.') 运算符的优先级高于符号运算符。

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

【讨论】:

    【解决方案2】:

    这里发生的是操作顺序。让我们分解一下:

    首先会发生的是 3e5 将返回一个数字(300000),然后将调用 toFixed ,将其转换为字符串,然后将执行符号运算符,将字符串强制返回一个数字。

    【讨论】:

    • 没错,但是javascript中没有the sign operator的概念。最后一步是一元否定运算符在求值过程中尝试将其操作数转换为数字。你可以看到Unary_negation
    猜你喜欢
    • 1970-01-01
    • 2013-08-12
    • 2018-02-05
    • 2011-01-18
    • 1970-01-01
    • 2015-02-20
    • 2018-11-16
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多