jam*_*inc 10 javascript negative-zero
我在尝试在代码高尔夫游戏中优化弦乐复数时遇到了这个怪癖.我有想法将字符串写成复数,然后用来substr有条件地删除最后一个字符:
var counter = 1;
var myText = counter + " units".substr(0, 6-(counter===1));
Run Code Online (Sandbox Code Playgroud)
这很好 - 它做了我想要的.但是看看String.prototype.slice()的MDN文档,我认为通过使用负零作为函数的第二个参数,我找到了一种使其更短的方法.来自文档:
endSlice
可选的.从零开始的索引,用于结束提取.如果省略,slice()将提取到字符串的末尾.如果为负数,则将其视为sourceLength + endSlice,其中sourceLength是字符串的长度(例如,如果endSlice为-3,则将其视为sourceLength - 3).
var myText = counter + " units".slice(0,-(counter===1));
Run Code Online (Sandbox Code Playgroud)
这将评估为何.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;博士,我咸,我不能对赢得代码高尔夫笑话切片.
从数学角度来看,不存在负零。正数是任何大于零的数,负数是任何小于零的数。零不是其中之一。所以我想你所描述的行为是正确的。
实数可以是有理数,也可以是无理数;代数的或超越的;以及正数、负数或零。
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" : "");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |