Javascript 在String.prototype.slice()中,.slice(0,-0)和.slice(0,+;0)是否应该输出相同的结果?

Javascript 在String.prototype.slice()中,.slice(0,-0)和.slice(0,+;0)是否应该输出相同的结果?,javascript,negative-zero,Javascript,Negative Zero,我在一场代码高尔夫游戏中尝试优化字符串多元化时遇到了这个怪癖。我的想法是将字符串写成复数,然后使用substr有条件地删除最后一个字符: var counter = 1; var myText = counter + " units".substr(0, 6-(counter===1)); 这很好,它做了我想要的。但是看看这个函数,我想我已经找到了一种方法,通过使用传递负零作为函数的第二个参数,使它变得更短。从文档中: endSlice 可选。结束提取的从零开始的索引。如果

我在一场代码高尔夫游戏中尝试优化字符串多元化时遇到了这个怪癖。我的想法是将字符串写成复数,然后使用
substr
有条件地删除最后一个字符:

var counter = 1;
var myText = counter + " units".substr(0, 6-(counter===1));
这很好,它做了我想要的。但是看看这个函数,我想我已经找到了一种方法,通过使用传递负零作为函数的第二个参数,使它变得更短。从文档中:

endSlice

可选。结束提取的从零开始的索引。如果省略,slice()将提取到字符串的末尾如果为负,则将其视为sourceLength+endSlice,其中sourceLength是字符串的长度(例如,如果endSlice为-3,则将其视为sourceLength-3)

计数器
等于1时,它将计算为
.slice(0,-1)
,这将从字符串中切掉最后一个字母,否则它将计算为
.slice(0,-0)
,根据文档,这意味着从正在操作的字符串长度中减去0个字符

碰巧,-0被
String.prototype.slice
视为与+0相同。我想知道这是否是一种惯例,将-0视为与+0相同(例如,我知道,
-0===+0
的计算结果为
true
)。我想看看
String.prototype.substr
,但是+0和-0应该在该函数中以相同的方式处理

有人对此有更深入的了解吗?在语言设计中是否有一些基本的惯例规定,尽管符号零是一种语言特性,但除了在某些情况下(如
1/-0
),它应该被忽略


tl;dr我太咸了,我不能拿通过切片赢得代码高尔夫开玩笑。

从数学角度看,不存在负零。正是大于零的任何数字,负是小于零的任何数字。零不是这两个。所以我想你描述的行为是正确的

实数可以是有理数,也可以是无理数;代数的 或超越的;或者是正的,负的,或者是零

虽然,因为在编程中我们使用的是浮点数,它是实数的近似值,所以有一个-0的概念,它可能是一个负数的表示,它太接近于零,否则无法表示-


关于javascript,您可以将其编写为:

var counter = 1;
var myText = counter + " unit" + (counter > 1 ? "s" : "");

还说“如果end是负数,它将被视为sourceLength+end,其中sourceLength是字符串的长度。”我认为他们在这里对“negative”一词不够小心。如何实现“If negative”?在我的代码中,我通过说
if(val<0)
来测试这一点,并且假设
-0<0
返回
false
…正如它应该的那样:想象一下,如果我们必须编写所有代码来区分
-0
+0
,第二个参数在与零进行比较之前被强制为整数(通过ToLimit)。整数没有负零。ECMA规范(只有真正的贪吃者才会阅读)详细解释了这一点。MDN是一种简化的描述。
-0
只是真实世界零的浮点表示,就像
+0
@nnnnnn一样。在研究它时,我发现Javascript确实提供了一些方法来测试正负零。例如:
1/-0===-Infinity
1/0===Infinity
嗯,不是“before”,浮点数是IEEE754。不确定标准本身是否在
-0
值中加入了任何语义(如“一个负数太接近于零,无法以其他方式表示”),但我毫不怀疑这一点。@zerkms-我认为这不是定义问题,而是物理限制,迫使数字在某个点舍入。无论如何,我不是这方面的专家,我自己也从未遇到过这个问题。我只是想指出,这个概念存在于编程中,尽管它与数学无关。请随意编辑答案(或添加一个新的答案)并提供更多细节。答案很好,只有一件事:它增加了一些额外的点,“这可能是一个负数太接近零的表示”。我不认为这是正确的:您可以精确地得到
-0
,并准确地表示这一点,这样它就不会是近似值或舍入误差。当然,有很多方法可以写我的例子。。。最后,我使用了一个稍微令人反胃的硬编码长度substr:
counter+“units”。substr(0,6-(counter==1))
,但像你这样的普通三元数是我认为最短的方法。编辑:请不要读入我的代码。。。我一直在寻找故意深奥的方法!
var counter = 1;
var myText = counter + " unit" + (counter > 1 ? "s" : "");