将JavaScript数字n转换为字符串s,以便所有n的Object.is(eval(s),n)?

时间:2018-07-06 04:08:23

标签: javascript floating-point type-conversion numbers language-lawyer

我需要将任意JavaScript数字转换为包含JavaScript表达式的字符串,这些字符串必须保证其值与原始数字相同。

通常,String()适用于大多数值,但值得注意的是String(-0)返回'0',尽管0 === -0Object.is(0, -0)返回false。

是否还有其他数字值n不能返回eval(String(n))的值?我特别考虑的是浮点数不能精确地用十进制表示的情况,并且由于四舍五入/精度不足,表示n选择的结果求值到附近但不同的浮点数。

如果是,我如何获得这些数字的String()-able字符串表示形式?

2 个答案:

答案 0 :(得分:2)

String(x)是唯一的例外。引用the spec(注1):

  

如果x是除-0以外的任何Number值,则ToNumber(ToString(x))与x完全相同。

请注意,ToString(x)的行为是当x不是符号(spec)之外的其他任何东西时,简单地调用console.log( String(1e2) ); console.log( Object.is(1e2,100) );

将数字转换为字符串时,精度永远不会丢失。格式可能与原始格式不同,但始终代表相同的数字:

Infinity

如@ASDFGerte所述,NaNInfinity可能被遮盖。因此,您可能还想为-InfinityNaNfunction reversibleNumberToString( x ) { if ( Object.is( -0, x ) ) return '-0'; const str = String(x); switch ( str ) { case 'Infinity': return '1/0'; case '-Infinity': return '-1/0'; case 'NaN': return '0/0'; default: return str; } } // Tests [ 0, 1, Math.random( ), -Infinity, Infinity, NaN ].forEach( x => { const Infinity = 'shadowed'; console.log( Object.is( x, eval( reversibleNumberToString( x ) ) ) ); } );添加例外。也许像这样:

$ad = Get-AdObject...
$obj1 = New-Object -TypeName PSCustomObject -property $ad

$hash = @{
    'col1'='header1';
    'col2'='header2';
     ...
}
$obj2 = New-Object -TypeName PSCustomObject -property $hash

$arr1 = @()
$arr1 += $obj2, $obj1
$arr1 | Export-csv -path...

答案 1 :(得分:-4)

具有编号功能

例如:

Number('0') === 0 // true