コードゴルフのゲームで、文字列の複数化を最適化しようとしているときに、私はこの奇妙なことに出くわしました。私は条件付きで、複数形としての文字列を書き込み、最後の文字をカットする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 === +0
がtrue
に評価され、私が知っている、例えば)の治療に-0 +0と同じであるとして、疑問に思いました。私はString.prototype.substr
を見ようと考えましたが、+0と-0はその関数で同じように扱われるはずです。
誰もがこれに任意のより深い洞察を持っていますか?署名付きゼロは言語機能ですが、特定のシナリオ(1/-0
など)を除いて、無視する必要があることを示す言語設計の基本的な規則はありますか?
TL; DR私はをスライスことにより、コードゴルフを受賞についてのジョークを作ることができないという塩辛いです。数学的な観点から
[標準](http://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype.slice)には、「endが負の場合、sourceLength + endとして扱われますsourceLengthは文字列の長さです。私は彼らがここで "否定的"という言葉について十分に注意を払っていないと思う。 – user2357112
"否定的な場合"はどのように実装しますか?私のコードでは、 'if(val <0)'と '-0 <0'が' false'を返すということでテストします。 '-0'と' + 0' ... – nnnnnn
第2パラメータはゼロと比較される前に整数に強制されます(ToLimitによって)。整数には負のゼロはありません。これは、ECMA仕様(刑罰のための真のダイトウだけが読むでしょう)の骨の折れる詳細で説明されています。 MDNは簡単な説明です。 –