我在尝试优化代码高尔夫游戏中的字符串多元化时遇到了这种怪癖。我的想法是将字符串写成复数,然后使用substr有条件地剪掉最后一个字符:
var counter = 1;
var myText = counter + " units".substr(0, 6-(counter===1));没事-它能做我想做的事。但是看看用于String.prototype.slice()的MDN文档,我想我找到了一种方法来使它更短,使用负零作为函数的第二个参数。从医生那里:
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),根据文档,.slice(0,-0)应该意味着从所操作的字符串的长度中减去0个字符。
碰巧,-0被String.prototype.slice处理为+0。我想知道这是否是一种惯例,将-0视为+0 (例如,我知道,-0 === +0的计算结果为true)。我想看看String.prototype.substr,但是+0和-0应该在这个函数中以相同的方式处理。
有没有人对此有更深的洞察力?在语言设计中是否有一些基本的约定:虽然签名为零是一种语言特性,但除了某些场景(比如1/-0)之外,它应该被忽略吗?
tl;博士,我太咸了,我不能用切片来开玩笑打赢代码高尔夫。
发布于 2016-09-13 01:54:43
从数学的角度看,没有负零。正数大于零,负数小于零。零不是这两样。所以我想你描述的行为是正确的。
一个实数既可以是有理的,也可以是非理性的;可以是代数的,也可以是超越的;或者是正数,也可以是负数,也可以是零。
虽然,因为在编程中我们使用浮点数(这是实数的近似),但是有一个概念-0,它可以表示一个负数太接近于零而不能用- http://www.johndcook.com/blog/2010/06/15/why-computers-have-signed-zero/表示。
关于您的javascript,您可以将其写为:
var counter = 1;
var myText = counter + " unit" + (counter > 1 ? "s" : "");https://stackoverflow.com/questions/39460528
复制相似问题