【发布时间】:2018-12-14 14:53:23
【问题描述】:
我需要将任意 JavaScript 数字转换为包含 JavaScript 表达式的字符串,这些表达式的值保证与原始数字相同。
一般来说,String() 对大多数值都适用,但值得注意的是 String(-0) 返回 '0',尽管 0 === -0、Object.is(0, -0) 返回 false。
是否还有其他数字值n eval(String(n)) 不返回值 n?我特别考虑浮点数不能以十进制精确表示的情况,并且由于舍入/精度不足,String() 选择的表示形式会评估为附近但不同的浮点数。
如果是这样,我如何获得这些数字的eval-able 字符串表示?
【问题讨论】:
-
你必须照顾
-0、Infinity和NaN。注意后两者是全局对象的属性,理论上可以被遮蔽。当心{ let Infinity = 0; console.log(eval(Infinity)); }之类的场景(例如,当您仍然使用它时,通过间接的eval调用访问全局对象)。我认为其他值不会有问题,但我超级累,因此无法保证任何事情。 -
你关于阴影的观点是很好的,但
Infinity、-Infinity和NaN都被String()处理得很好。我担心的值是eval(String(x)) !== x的浮点值(如果存在的话)。 -
明确一点:这个问题主要是关于
Number.prototype.toString和eval使用的算法的准确性/可逆性。 -
请参阅7.1.12.1 NumberToString 上的“注 1”。我还没有弄清楚在解析文字和将字符串解析为数字之间是否存在隐藏的陷阱,但我非常怀疑。我几乎可以得出结论,除了
-0(如注释中所述)和阴影问题或相关问题之外,它应该可以工作。
标签: javascript floating-point type-conversion numbers language-lawyer