我在尝试优化代码高尔夫游戏中的字符串复数时遇到了这个怪癖。 我想将字符串写成复数形式,然后使用substr
有条件地剪切最后一个字符:
var counter = 1;
var myText = counter + " units".substr(0, 6-(counter===1));
没问题 - 它做到了我想要的。但是看了一下MDN docs for String.prototype.slice(),我发现可以通过将负零作为第二个参数传递给函数来使它更短。从文档中可以看出:
endSlice
可选。要结束提取的基于零的索引。如果省略,slice() 将一直提取到字符串末尾。如果为负数,则当作 sourceLength + endSlice 处理,其中 sourceLength 是字符串的长度(例如,如果 endSlice 为 -3,则会被视为 sourceLength - 3)。
var myText = counter + " units".slice(0,-(counter===1));
当 counter
等于1 时,这将评估为 .slice(0,-1)
,它将从字符串中切掉最后一个字母,否则它将评估为 .slice(0,-0)
,根据文档应该意味着从操作的字符串长度中减去了0个字符。
事实上,String.prototype.slice
将 -0 和 +0 视为相同。我想知道这是否是一种惯例,即将 -0 视为与 +0 相同 (例如,-0 === +0
的结果为 true
)。 我想看看 String.prototype.substr
,但在该函数中 +0 和 -0 应该被同样处理。
有没有人对此有更深入的了解?在语言设计中是否有一些基本约定,规定带符号零是一种语言特性,它应该被忽略,除了某些情况(例如 1/-0
)?
简而言之,很遗憾我不能开玩笑说通过“切片”赢得代码高尔夫比赛。
if (val < 0)
进行测试,考虑到-0 < 0
返回false
,这也是应该的...请想象一下,如果我们必须编写所有的代码来区分-0
和+0
的情况... - nnnnnn1/-0 === -Infinity
而1/0 === Infinity
- jamesinc