Was bedeutet = + _ in JavaScript?

252

Ich habe mich gefragt, was der Operator = + _ in JavaScript bedeutet. Es sieht so aus, als würde es Aufgaben erledigen.

Beispiel:

hexbin.radius = function(_) {
   if (!arguments.length)
       return r;
   r = +_;
   dx = r * 2 * Math.sin(Math.PI / 3);
   dy = r * 1.5;
   return hexbin;
};
Dimitry
quelle
57
Erinnerte mich an die guten alten Ansatz Operator-->
ov
12
Das + hier ist ein unärer Operator mit _ als Operand.
Pieter Witvoet
44
Es sieht so aus, als könnte ein Perl-Programmierer die Standardvariable nicht loslassen ;-)
Michael Wild
4
Eine gute Hervorhebung der Syntax hätte Ihnen bei der Beantwortung der Frage geholfen.
Hugo der Hungrige
18
Sie können ein Smiley-Gesicht machenx= +_+ 0;
tckmn

Antworten:

396
r = +_;
  • +versucht, alles, was _ist, auf eine Zahl zu übertragen.
  • _ist nur ein Variablenname (kein Operator), es könnte sein a, fooetc.

Beispiel:

+"1"

Wirf "1" auf die reine Nummer 1.

var _ = "1";
var r = +_;

rist jetzt 1nicht "1".

Darüber hinaus laut der MDN-Seite über arithmetische Operatoren :

Der unäre Plus-Operator steht vor seinem Operanden und wertet ihn als Operanden aus, versucht jedoch, ihn in eine Zahl umzuwandeln , sofern dies noch nicht geschehen ist . [...] Es kann Stringdarstellungen von ganzen Zahlen und Schwimmer, sowie die Nicht-String - Werte konvertieren true, falseund null. Ganzzahlen im Dezimal- und Hexadezimalformat (mit "0x"Präfix) werden unterstützt. Negative Zahlen werden unterstützt (jedoch nicht für Hex). Wenn ein bestimmter Wert nicht analysiert werden kann, wird er ausgewertet NaN.

Es wird auch darauf hingewiesen, dass

unary plus ist der schnellste und bevorzugte Weg, etwas in eine Zahl umzuwandeln

mpm
quelle
2
Bedeutet + wirklich, in eine Zahl umgewandelt zu werden, oder bedeutet dies +_wirklich 0+_, in welchem ​​Fall _muss vor dem Hinzufügen zu 0 gewirkt werden?
Colincameron
3
@ c.cam108 Siehe die MDN-Seite des unären Plus-Operators .
einsamer
17
@ c.cam108 - Nein, sie verhalten sich nicht ähnlich. Unäres Plus wandelt den Wert in eine Zahl um, binäres Plus jedoch nicht: +'12' === 12(Ergebnis ist eine Zahl), sondern 0 + '12' === '012'(Ergebnis ist eine Zeichenfolge). Beachten Sie jedoch, dass 0 - '12' === -12.
Kobi
1
@juzerali Sicher, aber das ist keine gute Praxis. Versuchen Sie es mit Addition;)
Izkata
Sieht perlisch aus mit Perls Standardvariable $ _
Matthew Lock
95

Es ist kein Zuweisungsoperator.

  • _ ist nur ein Parameter, der an die Funktion übergeben wird.

    hexbin.radius = function(_) {
                    //       ^ It is passed here
        // ...
    };
  • In der nächsten Zeile r = +_; +infront wird diese Variable ( _) in eine Zahl oder einen ganzzahligen Wert umgewandelt und der Variablen zugewiesenr

Verwechseln Sie es nicht mit dem +=Bediener

Starx
quelle
54

=+Sind eigentlich zwei Operatoren =ist Zuweisung und +und _Variablenname.

mögen:

i = + 5;
or 
j = + i;
or 
i = + _;

Meine folgenden Codes helfen Ihnen dabei, die Verwendung von =+zum Konvertieren eines Strings in int zu zeigen .
Beispiel:

y = +'5'
x = y +5
alert(x);

Ausgänge 10

use: Also hier yist int 5wegen =+
sonst:

y = '5'
x = y +5
alert(x);

Ausgänge 55

Wo wie _ist eine Variable.

_ = + '5'
x = _ + 5
alert(x)

Ausgänge 10

Darüber hinaus wäre es interessant zu wissen, dass Sie dasselbe auch mit erreichen können ~(wenn string int string ist (float ist eine Runde von int) ).

y = ~~'5'  // notice used two time ~
x = y  + 5
alert(x);

gibt auch 10 aus

~ist bitweise NICHT: Invertiert die Bits seines Operanden. Ich habe zweimal ohne Größenänderung gearbeitet.

Grijesh Chauhan
quelle
1
Ich benutze oft x|0, um double in int umzuwandeln; Dies und die Verwendung von '~' haben jedoch die Strafe, sich auf Zahlen <2 ^ 32 zu beschränken. + "2e15" nicht.
Aki Suihkonen
@AkiSuihkonen Ja gut ich glaube x|0ist dann noch schneller +. Richtig ? schöne Technik :). (2) Ich benutze ~nur, um OP zu zeigen, dass +nicht nur ein Zeichen verwendet werden kann ( ich selbst benutze+ ).
Grijesh Chauhan
Schwer zu sagen - es gibt jsperf, aber man möchte es messen. OTOH diese beiden Operatoren haben eine völlig unterschiedliche Bedeutung. Wenn nur eine Zahl (und keine Ganzzahl) erforderlich ist, ist '+' ohnehin ein Zeichen kürzer.
Aki Suihkonen
1
Eigentlich habe ich es gerade getestet jsperf - 18M ops für '| 0', 19M ops für '+'; Die Leistung wird wahrscheinlich von Browser zu Browser variieren. jsperf.com/strtoint
Aki Suihkonen
1
@AkiSuihkonen Oh mein Gott, habe gerade den jsperf-Test in Firefox gemacht, großer Unterschied ... |viel schneller.
Tapirboy
16

Es ist nicht =+. In JavaScript +bedeutet dies, dass Sie es in eine Zahl ändern.

+'32' gibt 32 zurück.

+'a' gibt NaN zurück.

Sie können also verwenden isNaN(), um zu überprüfen, ob es in eine Nummer geändert werden kann.

Ovilia
quelle
16

Es ist eine hinterhältige.

Es ist wichtig zu verstehen, dass der Unterstrich hier tatsächlich ein Variablenname und kein Operator ist.

Das Pluszeichen davor gibt den positiven numerischen Wert des Unterstrichs an - dh, die Unterstrichvariable wird effektiv in ein int umgewandelt. Sie könnten den gleichen Effekt mit erzielen parseInt(), aber das Pluszeichen wird hier wahrscheinlich verwendet, weil es prägnanter ist.

Und damit bleibt das Gleichheitszeichen nur eine Standardvariablenzuweisung.

Es ist wahrscheinlich nicht absichtlich geschrieben, um zu verwirren, da ein erfahrener Javascript-Programmierer den Unterstrich im Allgemeinen als Variable erkennt. Aber wenn Sie nicht wissen, dass es definitiv sehr verwirrend ist. Ich würde es bestimmt nicht so schreiben; Ich bin im besten Fall kein Fan von kurzen, bedeutungslosen Variablennamen. Wenn Sie kurze Variablennamen in JS-Code verwenden möchten, um Platz zu sparen, verwenden Sie einen Minifier. Schreiben Sie es zunächst nicht mit kurzen Variablen.

DEZA
quelle
1
+1, da Sie hier als einziger ausdrücklich darauf hinweisen, dass _es sich um eine Variable handelt.
TRiG
@TRiG was ist mit der Antwort von Starx, die dies tut, ohne tl; dr zu sein?
Mathletics
12

= + _ wird _ in eine Zahl umwandeln.

So

var _ = "1",
   r = +_;
console.log(typeof r)

würde Nummer ausgeben.

Harsha Ivaturi
quelle
9

Ich nehme an du meinst r = +_;? In diesem Fall wird der Parameter in a konvertiert Number. Sagen _wir '12 .3 'und +'12.3'kehren dann zurück 12.3. So wird in der zitierten Anweisung +_zugeordnet r.

KooiInc
quelle
6

_ist nur ein Variablenname, der als Funktionsparameter übergeben hexbin.radiusund +in eine Zahl umgewandelt wird

Lassen Sie mich ein Beispiel wie Ihre Funktion machen.

var hexbin = {},r  ;

hexbin.radius = function(_) {
   if (!arguments.length)
      return r;
   console.log( _ , typeof _ )    
   r = +_;
   console.log( r , typeof r , isNaN(r) );   
}

und führen Sie diese Beispielfunktion aus

hexbin.radius ("1");

1 string
1 number false 

hexbin.radius (1);

1 number
1 number false

hexbin.radius ([]);

[] object
0 number false

hexbin.radius ('a');

a string
NaN number true

hexbin.radius ({});

Object {} object
NaN number true

hexbin.radius (wahr);

true boolean
1 number false
rab
quelle
Sehr spät beantwortet, aber sehr schöne Antwort +.
Grijesh Chauhan
5

Es wird der linken Variablen eine neue Zahl zugewiesen.

var a=10;
var b="asg";
var c=+a;//return 10
var d=-a;//return -10
var f="10";

var e=+b;
var g=-f;

console.log(e);//NAN
console.log(g);//-10
Amrendra
quelle
Du hast ein +vor dem vergessen b.
Attila O.
1
Danke 4, der mir hilft, eine gute Antwort zu schreiben.
Amrendra
3

+_ist fast gleichbedeutend mit parseFloat(_). Beachten Sie, dass dies parseIntbei nicht numerischen Zeichen wie Punkt endetparshFloat nicht der ist.

EXP:

    parseFloat(2.4) = 2.4 
vs 
    parseInt(2.4) = 2 
vs 
    +"2.4" = 2.4

Exp:

var _ = "3";
    _ = +_;

console.log(_); // will show an integer 3

Sehr wenige Unterschiede:

Brian
quelle
Ich denke, in der ersten Zeile möchten Sie sagen, parseInr(_)anstatt parseFloat(_) ?
Grijesh Chauhan
1
Nein, das habe ich gemeint float, da parseInt bei nicht numerischen Zeichen anhält, parshFloat jedoch nicht. EXP: parseFloat(2.4) = 2.4vs parseInt(2.4) = 2.
Brian
3

Einfach ausgedrückt, +_ entspricht der Verwendung des Number () -Konstruktors.

In der Tat funktioniert es sogar an Daten:

var d = new Date('03/27/2014');
console.log(Number(d)) // returns 1395903600000
console.log(+d) // returns 1395903600000

DEMO: http://jsfiddle.net/dirtyd77/GCLjd/


Weitere Informationen finden Sie auch im Abschnitt MDN - Unary plus (+) :

Der unäre Plus-Operator steht vor seinem Operanden und wertet ihn als Operanden aus, versucht jedoch, ihn in eine Zahl umzuwandeln, sofern dies noch nicht geschehen ist. Obwohl unäre Negation (-) auch Nicht-Zahlen konvertieren kann, ist unäres Plus die schnellste und bevorzugte Methode, um etwas in eine Zahl umzuwandeln, da keine anderen Operationen an der Zahl ausgeführt werden. Es kann Zeichenfolgendarstellungen von Ganzzahlen und Gleitkommazahlen sowie die Nicht-Zeichenfolgenwerte true, false und null konvertieren. Ganzzahlen in den Formaten Dezimal und Hexadezimal ("0x") werden unterstützt. Negative Zahlen werden unterstützt (jedoch nicht für Hex). Wenn ein bestimmter Wert nicht analysiert werden kann, wird NaN ausgewertet.

Dom
quelle
2

In diesem Ausdruck:

r = +_;
  • '+' fungiert hier als unärer Operator, der versucht , den Wert des richtigen Operanden zu konvertieren . Es wird nicht der Operand, sondern der ausgewertete Wert konvertiert. So _bleibt "1", wenn es ursprünglich so war, aber die rwird reine Zahl.

Betrachten Sie diese Fälle, ob Sie das + für die numerische Konvertierung anwenden möchten

+"-0" // 0, not -0
+"1" //1
+"-1" // -1
+"" // 0, in JS "" is converted to 0
+null // 0, in JS null is converted to 0
+undefined // NaN
+"yack!" // NaN
+"NaN" //NaN
+"3.14" // 3.14

var _ = "1"; +_;_ // "1"
var _ = "1"; +_;!!_ //true
var _ = "0"; +_;!!_ //true
var _ = null; +_;!!_ //false

Obwohl es der schnellste numerische Konverter ist, würde ich kaum einen empfehlen, ihn zu überbeanspruchen, wenn überhaupt. parseInt/parseFloatsind gut lesbarere Alternativen.

Arman McHitarian
quelle