Em String.prototype.slice (), deve .slice (0, -0) e .slice (0, + 0) produzir o mesmo resultado?

9

Eu me deparei com essa peculiaridade ao tentar otimizar a pluralização de strings em um jogo de code-golf. Eu tive a ideia de escrever strings como plurais e então usar substr para cortar o último caractere, condicionalmente:

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

Tudo bem - faz o que eu queria. Mas, olhando para os documentos do MDN para String.prototype.slice () , eu pensei que tinha encontrado uma maneira de torná-lo ainda mais curto, usando a passagem de zero negativo como o segundo argumento para a função. Dos documentos:

  

endSlice

     

Opcional. O índice baseado em zero no qual finalizar a extração. Se omitido, o slice () extrai o final da string. Se negativo, é tratado como sourceLength + endSlice, em que sourceLength é o comprimento da string (por exemplo, se endSlice for -3, será tratado como sourceLength - 3).

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

Isso é avaliado como .slice(0,-1) quando counter é igual a 1, o que cortaria a última letra da string ou seria avaliada como .slice(0,-0) , que, de acordo com os documentos, deve significar que 0 caracteres foram subtraídos o comprimento da corda sendo operada.

Quando isso acontece, -0 é tratado da mesma forma que +0 por String.prototype.slice . Gostaria de saber se isso era uma convenção, tratar -0 como sendo o mesmo que +0 (eu sei, por exemplo, -0 === +0 avalia para true ). Eu pensei em olhar para String.prototype.substr , mas +0 e -0 devem ser tratados da mesma maneira nessa função.

Alguém tem algum insight maior sobre isso? Existe alguma convenção básica no design da linguagem que declara que, embora o zero assinado seja um recurso de linguagem, ele deve ser ignorado, exceto em determinados cenários (como 1/-0 )?

tl; dr Eu sou salgado que não posso fazer piadas sobre ganhar o 'code golf' por slicing .

    
por jamesinc 13.09.2016 в 02:23
fonte

1 resposta

2

Do ponto de vista matemático, não há zero negativo. Positivo é qualquer número maior que zero e negativo é qualquer número menor que zero. Zero não é nenhum desses. Então, acho que o comportamento que você descreveu está correto.

  

Um número real pode ser racional ou irracional; algébrico   ou transcendental; e positivo, negativo ou zero.

link

Embora, na programação, trabalhemos com números de ponto flutuante, que são uma aproximação de números reais, existe um conceito de -0, que poderia ser uma representação de um número negativo muito próximo de zero para ser representado de outra forma - < href="http://www.johndcook.com/blog/2010/06/15/why-computers-have-signed-zero/"> link

Em relação ao seu javascript, você pode escrevê-lo como:

var counter = 1;
var myText = counter + " unit" + (counter > 1 ? "s" : "");
    
por Hugo Silva 13.09.2016 / 03:54
fonte