コードゴルフのゲームで文字列の複数形を最適化しようとしているときに、この癖に出くわしました。文字列を複数形で書き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スライシングでコードゴルフに勝ったなんて冗談は言えないのがしょっぱいです。