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

时间:2016-09-13 00:23:01

标签: javascript negative-zero

我在尝试在代码高尔夫游戏中优化字符串复数时遇到了这个怪癖。我有想法将字符串写成复数,然后使用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 我很讨厌我不能通过切片开玩笑赢得代码高尔夫球。

1 个答案:

答案 0 :(得分:2)

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

  

实数可能是理性的,也可能是非理性的;要么是代数的   或超然的;无论是正面,负面还是零。

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

虽然,因为在编程中我们使用浮点数(它是实数的近似值),所以有一个-0的概念,它可以表示负数过于接近零而无法表示 - { {3}}

关于你的javascript,你可以把它写成:

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