2016-09-13 30 views
9

Natrafiłem na to dziwactwo, próbując zoptymalizować pluralizację ciągów w grze w golfa kod. Miałem pomysł, aby napisać sznurki jak mnogiej, a następnie użyć substr wyciąć ostatni znak off, warunkowo:W String.prototype.slice(), powinny .slice (0, -0) i .slice (0, + 0) dają ten sam wynik?

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

Jest w porządku - robi to co chciałem. Ale patrząc na MDN docs for String.prototype.slice(), myślałem, że znalazłem sposób, aby go jeszcze jeszcze krótszy, za pomocą przekazywania ujemne zero jako drugi argument funkcji. Od docs:

endSlice

opcjonalne. Indeks oparty na zera, od którego należy zakończyć ekstrakcję. Jeśli zostanie pominięty, slice() wyodrębnia się na końcu łańcucha. Jeśli jest ujemny, jest traktowany jako sourceLength + endSlice, gdzie sourceLength jest długością ciągu (na przykład, jeśli endSlice ma wartość -3, jest traktowane jako sourceLength - 3).

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

ten ocenia się .slice(0,-1) gdy counter jest równy 1, co posiekać ostatni list od napisu, lub byłoby w inny sposób ocenić na .slice(0,-0), które zgodnie z docs powinno oznaczać 0 znaków odjęto od długość sznurka obsługiwanego.

Tak się składa, że ​​-0 jest traktowane tak samo jak +0 przez String.prototype.slice. Zastanawiałem się, czy to była konwencja, aby traktować -0 jako taką samą jak +0 (wiem, na przykład, -0 === +0 ocenia się na true). Pomyślałem, aby spojrzeć na String.prototype.substr, ale +0 i -0 powinny być obsługiwane w ten sam sposób w tej funkcji.

Czy ktoś ma lepszy wgląd w to? Czy istnieje pewna podstawowa konwencja w projekcie języka, która stwierdza, że ​​gdy podpisane zero jest funkcją językową, należy ją zignorować, z wyjątkiem pewnych scenariuszy (takich jak 1/-0)?

tl; dr jestem słony, że nie mogę żartować o wygranej kodu golfa przez krojenie.

+0

[standard] (http://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype.slice) również mówi "Jeśli koniec jest negatywny, jest traktowany jako sourceLength + koniec, gdzie sourceLength to długość Stringa. " Myślę, że nie byli wystarczająco ostrożni, jeśli chodzi o słowo "negatyw". – user2357112

+0

Jak wdrożysz "jeśli negatywny"? W moim kodzie testuję to, wypowiadając 'if (val <0)' i biorąc pod uwagę, że '-0 <0' zwraca' false' ... tak jak powinno: wyobraźmy sobie, że gdybyśmy musieli napisać cały nasz kod, aby rozróżnić '-0' i' + 0' ... – nnnnnn

+1

Drugi parametr jest wymuszany na liczbę całkowitą (przez ToLimit) przed porównaniem do zera. Liczby całkowite nie mają ujemnego zera. Wyjaśnia to drobiazgowy szczegół w specyfikacji ECMA (czytać tylko prawdziwe obżarstwa dla kary). MDN jest uproszczonym opisem. –

Odpowiedz

2

Z matematycznego punktu widzenia nie ma ujemnego zera. Dodatnia to dowolna liczba większa od zera, a wartość ujemna to dowolna liczba mniejsza od zera. Zero nie jest żadnym z nich. Zgaduję więc, że opisane zachowanie jest poprawne.

Rzeczywista liczba może być racjonalna lub irracjonalna; albo algebraiczne lub transcendentalne; i albo dodatni, ujemny, albo zero.

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

Chociaż, ponieważ w programowaniu pracujemy z liczb zmiennoprzecinkowych, które są przybliżeniem liczb rzeczywistych, istnieje pojęcie -0, które mogłyby być reprezentacją liczby ujemnej zbyt blisko zeru być reprezentowane inaczej - http://www.johndcook.com/blog/2010/06/15/why-computers-have-signed-zero/


Odnośnie JavaScript, można zapisać go jako:

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

Cóż, nie "wcześniej", liczby zmiennoprzecinkowe to IEEE754. Nie jestem pewien, czy sam standard umieszcza jakąkolwiek semantykę (jak "liczba ujemna zbyt bliska zeru, aby być reprezentowanym w inny sposób") w wartości '-0', ale prawie nie wątpię. – zerkms

+0

@zerkms - Nie sądzę, że jest to kwestia definicji, ale raczej fizyczne ograniczenie, zmuszające do zaokrąglania liczb w pewnym momencie. W każdym razie nie jestem ekspertem w tej dziedzinie i nigdy sam nie doświadczyłem tego problemu. Po prostu chciałbym zauważyć, że koncepcja istnieje w programowaniu, mimo że nie jest matematycznie istotna. Zmodyfikuj odpowiedź (lub dodaj nową), aby uzyskać więcej informacji. –

+0

Odpowiedź jest w porządku, z jedną tylko rzeczą: wskazuje na to, że "może to być liczba ujemna zbyt bliska zeru". Którego nie uważam za poprawne: możesz mieć dokładnie "-0" i dokładnie to oznaczać, aby nie był to błąd przybliżenia lub zaokrąglenia. W ogóle usunę tę część. – zerkms

Powiązane problemy