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.
[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
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
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. –