2013-04-07 8 views
14

ich oft den TrickCoerce zur Nummer

after = +after; 

gesehen haben die Variable after auf eine Zahl zu zwingen. Beim Durchlesen der Node.JS source fand ich eine andere Methode:

after *= 1; // coalesce to number or NaN 

Ist die beide in ihrem Verhalten völlig gleichwertige Methoden?

Antwort

5

Nach einer schnellen google to make sure my suspicions were true kam ich zu dieser Schlussfolgerung. Die Verwendung des +-Operators zum Konvertieren in eine Zahl ist schneller, weil nach dem Typcasting keine mathematischen Operationen auftreten, während die Verwendung der *=-Methode bedeutet, dass nach after konvertiert wird, wird sie mit 1 multipliziert.

+0

Also gibt es keine Verhaltensunterschiede, nur Geschwindigkeit und Syntax? – Randomblue

+0

Ich bin kein Experte, aber die Frage im Zusammenhang mit der Syntax gegeben, die ich denke, dass ich geantwortet habe. Wenn das Gießen auf der Grundlage des Betreibers anders ist, weiß ich nicht. Das würde einen Geek mit Kräften erfordern, die weit über meinen hinausgehen! – christopher

1

Hinweis: In einigen Fällen after = after-0 anderes Verhalten ruft als after = after+0. Ich habe es mit Daten bemerkt.

Das in Chrome getestet V39 nur:

var date = new Date(2000,0,1); 
date += date; //"Sat Jan 01 2000 00:00:00 GMT+0000 (GMT Standard Time)Sat Jan 01 2000 00:00:00 GMT+0000 (GMT Standard Time)" 
var date2 = new Date(2000,0,1); 
date2 + 0; //"Sat Jan 01 2000 00:00:00 GMT+0000 (GMT Standard Time)0" 
date2 - 0; //946684800000 
date2 * 1; //946684800000 

Ich weiß nicht, was in der JS-Spezifikation definiert ist, aber mit Terminen, weil sowohl das Datum und die Nummer kann auf einen String gegossen werden, und der + Operator arbeitet an einer Zeichenkette, dann geht Chrome mit einer Zeichenkettenverkettung. Da der Operator - kein String-Äquivalent hat, wird auf den Zahlenvergleich zurückgegriffen.

Ich habe dies nützlich gefunden, wenn Daten in Zahlen für Vergleiche

0

Ja, aber beachten Sie, dass es nur der einstelligen + Operator Nötigung, das dies tut. I.e. 10 + "10" gibt Ihnen "1010".

Eine vielleicht weniger fehleranfällig Option ist zu verwenden, was asm.js tut:

10 + ("10"|0) 

Obwohl auf der Abwärtsseite es die Klammern benötigt. Es sollte auf jeden Fall die schnellste Option sein (wahrscheinlich gleich unary +).

+3

Dies wird die Zahl in eine ganze Zahl, nicht nur eine Zahl (dh: '(" 10.7 "| 0) === 10'). Wenn Sie den String nur in eine Zahl umwandeln möchten, verwenden Sie unary plus ('+" 10.7 "=== 10.7') – Jack

Verwandte Themen