Ich stieß auf diese Eigenart, während ich versuchte, die String-Pluralisierung in einem Spiel mit Code-Golf zu optimieren. Ich hatte die Idee Strings als Plurale zu schreiben und dann substr
verwendet das letzte Zeichen aus, bedingt zu schneiden:In String.prototype.slice() sollten .slice (0, -0) und .slice (0, + 0) dasselbe Ergebnis ausgeben?
var counter = 1;
var myText = counter + " units".substr(0, 6-(counter===1));
Es ist in Ordnung - es tut, was ich wollte. Aber mit Blick auf die MDN docs for String.prototype.slice() dachte ich, ich hätte einen Weg gefunden, es noch kürzer zu machen, durch die Verwendung von negativen Null als zweites Argument für die Funktion. Aus der Dokumentation:
endSlice
Optional. Der nullbasierte Index, auf dem die Extraktion beendet werden soll. Falls weggelassen, extrahiert slice() bis zum Ende der Zeichenfolge. Wenn negativ, wird es als sourceLength + endSlice behandelt, wobei sourceLength die Länge der Zeichenfolge ist (wenn endSlice beispielsweise -3 ist, wird es als sourceLength - 3 behandelt).
var myText = counter + " units".slice(0,-(counter===1));
Dies wertet zu .slice(0,-1)
wenn counter
gleich 1 ist, was den letzten Brief aus dem String hacken würde, oder es würde sonst zu .slice(0,-0)
, bewerten, die die Dokumentation nach bedeuten sollte 0 Zeichen abgezogen wurden die Länge der zu bearbeitenden Saite.
Zufällig wird -0 genauso behandelt wie +0 von String.prototype.slice
. Ich fragte mich, ob dies eine Konvention war, um -0 als das gleiche wie +0 zu behandeln (ich weiß, dass zum Beispiel -0 === +0
true
auswertet). Ich dachte an String.prototype.substr
, aber +0 und -0 sollen in dieser Funktion genauso gehandhabt werden.
Hat jemand einen größeren Einblick in diese? Gibt es eine grundlegende Konvention im Sprachdesign, die besagt, dass signierte Null zwar ein Sprachfeature ist, aber ignoriert werden sollte, außer in bestimmten Szenarien (wie 1/-0
)?
tl; dr Ich bin salzig, dass ich keine Witze über das Gewinnen Code Golf von Aufschneiden machen kann.
Der [Standard] (http://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype.slice) sagt auch "Wenn das Ende negativ ist, wird es als sourceLength + end wo behandelt sourceLength ist die Länge der Zeichenfolge. " Ich denke, sie waren nicht vorsichtig genug mit dem Wort "negativ" hier. – user2357112
Wie würden Sie "wenn negativ" implementieren? In meinem Code teste ich das, indem ich 'if (val <0)' sage und, dass '-0 <0 '' false' zurückgibt ... so wie es sollte: Stellen Sie sich vor, wir müssten unseren gesamten Code schreiben, um zu unterscheiden '-0' und' +0' ... – nnnnnn
Der zweite Parameter wird zu einer Ganzzahl (von ToLimit) gezwungen, bevor er mit Null verglichen wird. Ganzzahlen haben keine negative Null. Dies wird im Detail in der ECMA-Spezifikation (die nur wahre Vielfraße für Bestrafung lesen wird) erklärt. MDN ist eine vereinfachte Beschreibung. –