我在尝试在代码高尔夫游戏中优化字符串多元化时遇到了这个怪癖。我的想法是把字符串写成复数形式,然后substr
有条件地用来切断最后一个字符:
var counter = 1;
var myText = counter + " units".substr(0, 6-(counter===1));
没关系 - 它做我想要的。但是查看MDN 文档中的 String.prototype.slice(),我想我已经找到了一种让它更短的方法,方法是使用负零作为函数的第二个参数。从文档:
结束切片
可选的。结束提取的从零开始的索引。如果省略, slice() 将提取到字符串的末尾。如果为负,则将其视为 sourceLength + endSlice,其中 sourceLength 是字符串的长度(例如,如果 endSlice 为 -3,则将其视为 sourceLength - 3)。
var myText = counter + " units".slice(0,-(counter===1));
这将评估为何.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;博士我很咸,我不能开玩笑说通过切片来赢得代码高尔夫。