11

コードゴルフのゲームで文字列の複数形を最適化しようとしているときに、この癖に出くわしました。文字列を複数形で書きsubstr、条件付きで最後の文字を切り捨てるというアイデアがありました。

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

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

endSlice

オプション。抽出を終了するゼロベースのインデックス。省略した場合、slice() は文字列の末尾まで抽出します。負の場合、sourceLength + endSlice として扱われます。ここで、sourceLength は文字列の長さです(たとえば、endSlice が -3 の場合、sourceLength - 3 として扱われます)。

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

これは、 is が 1 に等しい.slice(0,-1)場合に評価され、文字列から最後の文字が切り取られます。または、それ以外の場合は に評価されます。これは、ドキュメントによると、操作対象の文字列の長さから 0 文字が差し引かれたことを意味するはずです。counter.slice(0,-0)

たまたま、-0 は によって +0 と同じように扱われString.prototype.sliceます。これは、-0 を +0 と同じものとして扱うための規則なのだろうか (たとえば、 が に-0 === +0評価されることはわかっていますtrue)。を見て思ったのですString.prototype.substrが、その関数では+0も-0も同じように扱われているはずです。

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

tl;drスライシングでコードゴルフに勝ったなんて冗談は言えないのがしょっぱいです。

4

1 に答える 1

2

数学的な観点からは、負のゼロはありません。正は 0 より大きい任意の数であり、負は 0 未満の任意の数です。ゼロはそのどちらでもない。したがって、あなたが説明した動作は正しいと思います。

実数は有理数または無理数のいずれかです。代数的または超越的。正、負、またはゼロのいずれかです。

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

ただし、プログラミングでは実数の近似値である浮動小数点数を使用するため、-0 の概念があります。これは、ゼロに近すぎて他の方法では表現できない負の数を表す可能性があります - http:// www.johndcook.com/blog/2010/06/15/why-computers-have-signed-zero/


JavaScriptに関しては、次のように書くことができます:

var counter = 1;
var myText = counter + " unit" + (counter > 1 ? "s" : "");
于 2016-09-13T01:54:43.127 に答える