2016-09-13 2 views
9

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 === +0true 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.

+0

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

+0

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

+1

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

Antwort

2

Aus einer mathematischen Perspektive gibt es keine negative Null. Positiv ist eine Zahl größer als Null und negativ ist eine Zahl kleiner als Null. Null ist keiner von denen. Also denke ich, dass das von dir beschriebene Verhalten korrekt ist.

Eine reelle Zahl kann entweder rational oder irrational sein; entweder algebraisch oder transzendental; und entweder positiv, negativ oder null.

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

Obwohl, weil in der Programmierung wir mit Gleitkommazahlen arbeiten, die eine Annäherung der reellen Zahlen sind, gibt es ein Konzept von -0, die auch eine Darstellung einer negativen Zahl sein könnte schließen auf Null anders dargestellt werden - http://www.johndcook.com/blog/2010/06/15/why-computers-have-signed-zero/


In Bezug auf Ihre JavaScript aktivieren, können Sie es als schreiben konnte:

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

Nun, nicht "vor", Gleitkommazahlen sind IEEE754. Nicht sicher, ob der Standard selbst irgendeine Semantik (wie "eine negative Zahl zu nahe bei Null, um anders dargestellt zu werden") in den "-0" -Wert setzt, aber ich bezweifle es kaum. – zerkms

+0

@zerkms - Ich glaube nicht, dass es eine Frage der Definition ist, sondern eher eine physische Einschränkung, die die Zahlen dazu zwingt, irgendwann abgerundet zu werden. Wie auch immer, ich bin kein Experte auf diesem Gebiet und bin selbst nie auf dieses Problem gestoßen. Ich möchte nur darauf hinweisen, dass das Konzept in der Programmierung existiert, obwohl es nicht mathematisch relevant ist. Bitte zögern Sie nicht, die Antwort zu bearbeiten (oder eine neue hinzuzufügen) mit mehr Details. –

+0

Die Antwort ist in Ordnung, mit nur einer Sache: Es bringt einen zusätzlichen Punkt, "der eine Darstellung einer negativen Zahl zu nahe Null sein könnte". Was ich nicht richtig finde: Sie können genau '-0' haben und genau das bedeuten, so dass es keine Näherung oder ein Rundungsfehler wäre. Ich würde diesen Teil überhaupt entfernen. – zerkms

Verwandte Themen