11

我在尝试在代码高尔夫游戏中优化字符串多元化时遇到了这个怪癖。我的想法是把字符串写成复数形式,然后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;博士我很咸,我不能开玩笑说通过切片来赢得代码高尔夫。

4

1 回答 1

2

从数学的角度来看,没有负零。正数是任何大于零的数,负数是任何小于零的数。零不是那些。所以我猜你描述的行为是正确的。

实数可以是有理数也可以是无理数;代数的或超越的;以及正数、负数或零。

https://en.wikipedia.org/wiki/Real_number

虽然,因为在编程中我们使用浮点数,它是实数的近似值,但是有一个 -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" : "");
于 2016-09-13T01:54:43.127 回答