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

标签 javascript negative-zero

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

var counter = 1;
var myText = counter + " units".substr(0, 6-(counter===1));

很好 - 它可以满足我的要求。但是看着MDN docs for String.prototype.slice() ,我想我找到了一种方法,甚至更短,方法是使用传递负零作为函数的第二个参数。来自文档:

endSlice

Optional. The zero-based index at which to end extraction. If omitted, slice() extracts to the end of the string. If negative, it is treated as sourceLength + endSlice where sourceLength is the length of the string (for example, if endSlice is -3 it is treated as sourceLength - 3).

var myText = counter + " units".slice(0,-(counter===1));

counter 等于 1 时,它的计算结果为 .slice(0,-1),这会 chop 字符串中的最后一个字母,否则它会计算到 .slice(0,-0),根据文档,这意味着从正在操作的字符串的长度中减去 0 个字符。

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

有没有人对此有更深入的了解?语言设计中是否有一些基本约定表明,虽然带符号的零是一种语言特性,但它应该被忽略,除非在某些情况下(如 1/-0)?

tl;dr 我很生气,我不能开玩笑说通过切片赢得代码高尔夫。

最佳答案

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

A real number may be either rational or irrational; either algebraic or transcendental; and either positive, negative, or zero.

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

不过,因为在编程中我们使用的是 float ,它是实数的近似值,所以有 -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" : "");

关于javascript - 在String.prototype.slice()中,.slice(0,-0)和.slice(0,+0)应该输出相同的结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39460528/

相关文章:

php - 使用 jquery 的一页 Codeigniter 站点? Ajax ?

java - 为什么 float 有符号零?

c - 为什么 MSVS 不优化 +0?

c++ - 从 C++ 中的数据库值处理 -0

javascript正则表达式,单词后面没有特定字符

javascript - addEventListener 到一个元素,元素本身作为参数

r - R 有 "negative zero"吗?

javascript - 为什么 Math.min() 从 [+0, 0, -0] 返回 -0

javascript - 解码ajax响应下拉后出现空下拉字段

JavaScript 执行顺序