我在尝试在代码高尔夫游戏中优化字符串复数时遇到了这个怪癖。我有想法将字符串写成复数,然后使用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));
当.slice(0,-1)
等于1时,评估结果为counter
,这会切断字符串中的最后一个字母,否则会评估为.slice(0,-0)
,根据文档应该从被操作的字符串的长度中减去0个字符。
碰巧,{0被String.prototype.slice
视为与+ 0相同。我想知道这是否是一个约定,将-0视为与+0相同(例如,-0 === +0
评估为true
)。我想看看String.prototype.substr
,但+0和-0应该在该函数中以相同的方式处理。
有没有人对此有更深入的了解?语言设计中是否有一些基本惯例表明,虽然有符号零是一种语言特性,但应该忽略它,除非在某些情况下(如1/-0
)?
tl; dr 我很讨厌我不能通过切片开玩笑赢得代码高尔夫球。
答案 0 :(得分:2)
从数学角度来看,没有负零。正数是大于零的任何数字,负数是小于零的任何数字。零既不是那些。所以我猜你描述的行为是正确的。
实数可能是理性的,也可能是非理性的;要么是代数的 或超然的;无论是正面,负面还是零。
https://en.wikipedia.org/wiki/Real_number
虽然,因为在编程中我们使用浮点数(它是实数的近似值),所以有一个-0的概念,它可以表示负数过于接近零而无法表示 - { {3}}
关于你的javascript,你可以把它写成:
var counter = 1;
var myText = counter + " unit" + (counter > 1 ? "s" : "");