我在尝试在代码高尔夫游戏中优化弦乐复数时遇到了这个怪癖.我有想法将字符串写成复数,然后用来substr有条件地删除最后一个字符:
var counter = 1;
var myText = counter + " units".substr(0, 6-(counter===1));
Run Code Online (Sandbox Code Playgroud)
这很好 - 它做了我想要的.但是看看String.prototype.slice()的MDN文档,我认为通过使用负零作为函数的第二个参数,我找到了一种使其更短的方法.来自文档:
endSlice
可选的.从零开始的索引,用于结束提取.如果省略,slice()将提取到字符串的末尾.如果为负数,则将其视为sourceLength + endSlice,其中sourceLength是字符串的长度(例如,如果endSlice为-3,则将其视为sourceLength - 3).
var myText = counter + " units".slice(0,-(counter===1));
Run Code Online (Sandbox Code Playgroud)
这将评估为何.slice(0,-1)时counter等于1,这将切断字符串中的最后一个字母,否则它将评估为.slice(0,-0),根据文档应该意味着从正在操作的字符串的长度中减去0个字符.
碰巧,-0被视为与+ 0相同String.prototype.slice.我想知道这是否是一个惯例,将-0视为与+0相同(例如,我知道,-0 === +0评估为true).我想看看String.prototype.substr,但+0和-0应该在该函数中以相同的方式处理.
有没有人对此更深入了解?语言设计中是否有一些基本惯例表明,虽然有符号零是语言特征,但应该忽略它,除非在某些情况下(如1/-0)?
TL;博士,我咸,我不能对赢得代码高尔夫笑话切片.