2016-09-13 18 views
9

コードゴルフのゲームで、文字列の複数化を最適化しようとしているときに、私はこの奇妙なことに出くわしました。私は条件付きで、複数形としての文字列を書き込み、最後の文字をカットするsubstrを使用するためのアイデアを持っていた:String.prototype.slice()では、.slice(0、-0)と.slice(0、+ 0)は同じ結果を出力する必要がありますか?

var counter = 1; 
var myText = counter + " units".substr(0, 6-(counter===1)); 

それは結構です - それは私が望んでい。しかしMDN docs for String.prototype.slice()を見て、私は、関数の2番目の引数として渡し負のゼロを使用することにより、私はも短く、それを作るための方法を見つけたと思いました。ドキュメントから:

endSlice

オプション。抽出を終了する0から始まるインデックス。省略した場合、slice()は文字列の末尾まで抽出します。 負の場合には、sourceLength、文字列(例えば、endSliceであれば-3それはsourceLengthとして扱われる - 3)の長さであるsourceLength + endSliceとして扱われます。

var myText = counter + " units".slice(0,-(counter===1)); 

counterが1に等しいとき、これはドキュメントに係る0文字がから差し引いた平均べき、文字列から最後の文字を切ることになる、またはそれ以外.slice(0,-0)を評価するであろう、.slice(0,-1)に評価ストリングの長さは操作されます。

このように、-0はによって+0と同じように扱われます。これが慣例だった場合、私は(-0 === +0trueに評価され、私が知っている、例えば)の治療に-0 +0と同じであるとして、疑問に思いました。私はString.prototype.substrを見ようと考えましたが、+0と-0はその関数で同じように扱われるはずです。

誰もがこれに任意のより深い洞察を持っていますか?署名付きゼロは言語機能ですが、特定のシナリオ(1/-0など)を除いて、無視する必要があることを示す言語設計の基本的な規則はありますか?

TL; DR私はをスライスことにより、コードゴルフを受賞についてのジョークを作ることができないという塩辛いです。数学的な観点から

+0

[標準](http://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype.slice)には、「endが負の場合、sourceLength + endとして扱われますsourceLengthは文字列の長さです。私は彼らがここで "否定的"という言葉について十分に注意を払っていないと思う。 – user2357112

+0

"否定的な場合"はどのように実装しますか?私のコードでは、 'if(val <0)'と '-0 <0'が' false'を返すということでテストします。 '-0'と' + 0' ... – nnnnnn

+1

第2パラメータはゼロと比較される前に整数に強制されます(ToLimitによって)。整数には負のゼロはありません。これは、ECMA仕様(刑罰のための真のダイトウだけが読むでしょう)の骨の折れる詳細で説明されています。 MDNは簡単な説明です。 –

答えて

2

には負のゼロはありません。正は0より大きい任意の数であり、負は0より小さい任意の数です。ゼロはそれらのどちらもありません。だから私はあなたが記述した動作が正しいと思います。

実数は、有理数または無理のいずれであってもよいです。代数式 または超越;正、負、またはゼロのいずれかです。

https://en.wikipedia.org/wiki/Real_number

近すぎる負の数の表現である可能性があり、プログラミングで我々は実数の近似値です浮動小数点数、で動作するので、-0の概念があり、が、

var counter = 1; 
var myText = counter + " unit" + (counter > 1 ? "s" : ""); 
:あなたのjavascriptについて http://www.johndcook.com/blog/2010/06/15/why-computers-have-signed-zero/


、あなたのようにそれを書くことができます - そう表現するにはゼロに

+0

さて、 "before"ではなく、浮動小数点数はIEEE754です。標準自体が '-0'の値に(" 0に近すぎる負の数を表現すると、 "-0"のような)意味を置くかどうかはわかりませんが、私はそれをほとんど疑っていません。 – zerkms

+0

@zerkms - 私はそれが定義の問題ではなく、むしろ物理的な制限であると考えています。ある時点で数値を丸めなければなりません。とにかく、私は主題についての専門家ではなく、この問題を自分で見たことはありません。私は、たとえそれが数学的に適切ではないとしても、プログラミングに概念が存在することを指摘しています。詳細を記入して、自由に編集してください(または新しいものを追加してください)。 –

+0

答えはうまくいきます。ちょうど1つのことがあります。「ゼロに近すぎる負の数を表現することができる」という追加の点があります。私は正確ではない:正確に '-0'を持ち、正確に意味することができるので、近似値や丸め誤差ではありません。私はその部分をまったく取り除くだろう。 – zerkms

関連する問題