Cosa significa = + _ in JavaScript


252

Mi chiedevo cosa significasse l'operatore = + _ in JavaScript. Sembra che faccia compiti.

Esempio:

hexbin.radius = function(_) {
   if (!arguments.length)
       return r;
   r = +_;
   dx = r * 2 * Math.sin(Math.PI / 3);
   dy = r * 1.5;
   return hexbin;
};

57
Mi ha ricordato il buon vecchio approccio dell'operatore-->
OV

12
Il + qui è un operatore unario, con _ come suo operando.
Pieter Witvoet,

44
Sembra che un programmatore Perl non possa lasciar andare la variabile predefinita ;-)
Michael Wild,

4
Una buona evidenziazione della sintassi ti avrebbe aiutato a rispondere alla domanda.
hugo der hungrige,

18
Puoi fare una faccina sorridentex= +_+ 0;
tckmn

Risposte:


396
r = +_;
  • +prova a lanciare qualunque _sia un numero.
  • _è solo un nome variabile (non un operatore), potrebbe essere a, fooecc.

Esempio:

+"1"

cast "1" al puro numero 1.

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

rè ora 1no "1".

Inoltre, secondo la pagina MDN sugli operatori aritmetici :

L'operatore unario positivo precede il suo operando e restituisce il suo operando ma tenta di convertirlo in un numero, se non lo è già . [...] E 'possibile convertire rappresentazioni di stringa di numeri interi e galleggianti, così come i valori non stringa true, falsee null. "0x"Sono supportati numeri interi sia in formato decimale che esadecimale ( -prefisso). Sono supportati numeri negativi (anche se non per esadecimali). Se non è in grado di analizzare un determinato valore, verrà valutato NaN.

Si noti inoltre che

unary plus è il modo più veloce e preferito di convertire qualcosa in un numero


2
+ Significa davvero cast per un numero, o significa +_davvero 0+_, nel qual caso _deve essere lanciato prima di aggiungere a 0?
Colincameron,

3
@ c.cam108 Vedere la pagina MDN sull'operatore unary plus .
lunedì

17
@ c.cam108 - No, non si comportano in modo simile. Unary plus lancia il valore su un numero, ma il plus binario non lo fa: +'12' === 12(il risultato è un numero), ma 0 + '12' === '012'(il risultato è una stringa). Si noti, tuttavia, che 0 - '12' === -12.
Kobi,

1
@juzerali Certo, ma non è una buona pratica. Prova ad usare l'addizione;)
Izkata,

Sembra perlish con la variabile di default di perl $ _
Matthew Lock

95

Non è un operatore di assegnazione.

  • _ è solo un parametro passato alla funzione.

    hexbin.radius = function(_) {
                    //       ^ It is passed here
        // ...
    };
    
  • Nella riga successiva r = +_; +infront lancia quella variabile ( _) su un numero o valore intero e lo assegna a variabiler

NON CONFERMARLO CON l' +=operatore


54

=+sono in realtà due operatori =è assegnazione +ed _è il nome della variabile.

piace:

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

I miei codici seguenti ti aiuteranno a mostrare l'uso di =+per convertire una stringa in int .
esempio:

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

uscite 10

use: Quindi ecco yint 5perché =+
altrimenti:

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

uscite 55

Dove as _è una variabile.

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

uscite 10

Inoltre, sarebbe interessante sapere che potresti ottenere la stessa cosa anche con ~(se string è int string (float sarà arrotondato a int) )

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

genera anche 10

~è bit a bit NOT: inverte i bit del suo operando. Ho fatto due volte senza alcun cambiamento di grandezza.


1
Uso spesso x|0per convertire double in int; tuttavia questo oltre a usare '~' ha la penalità di limitare ai numeri <2 ^ 32. + "2e15" no.
Aki Suihkonen

@AkiSuihkonen Sì, bene, credo x|0sia ancora più veloce allora +. Corretto ? bella tecnica :). (2) Uso ~solo per mostrare che OP +non è solo un segno che può essere usato ( io stesso uso+ ).
Grijesh Chauhan

Difficile a dirsi: c'è jsperf anche se si vuole misurarlo. OTOH questi due operatori hanno un significato completamente diverso. Se richiede solo un numero (e non un numero intero) '+' è comunque più breve di un carattere.
Aki Suihkonen,

1
In realtà l'ho appena testato jsperf - 18M ops per '| 0', 19M ops per '+'; le prestazioni probabilmente varieranno da browser a browser. jsperf.com/strtoint
Aki Suihkonen

1
@AkiSuihkonen Oh mio Dio, ho appena fatto il test jsperf in Firefox, un'enorme differenza .. |molto più veloce.
Tapirboy

16

Non lo è =+. In JavaScript, +significa cambiarlo in numero.

+'32' restituisce 32.

+'a' restituisce NaN.

Quindi puoi usare isNaN()per verificare se può essere cambiato in numero.


16

È subdolo.

La cosa importante da capire è che il carattere di sottolineatura qui è in realtà un nome variabile , non un operatore.

Il segno più davanti a questo sta ottenendo il valore numerico positivo del carattere di sottolineatura, ovvero il cast effettivo della variabile di trattino basso come int. Potresti ottenere lo stesso effetto con parseInt(), ma il cast del segno più è probabilmente usato qui perché è più conciso.

E questo lascia solo il segno di uguale solo come assegnazione di una variabile standard.

Probabilmente non è stato scritto deliberatamente per confondere, poiché un programmatore Javascript esperto generalmente riconoscerà il carattere di sottolineatura come variabile. Ma se non sai che è decisamente molto confuso. Certamente non lo scriverei così; Non sono un fan dei nomi di variabili brevi insignificanti nel migliore dei casi - Se si desidera nomi di variabili brevi nel codice JS per risparmiare spazio, utilizzare un minificatore; non scriverlo con variabili brevi per cominciare.


1
+1, poiché sei l'unico qui a sottolineare esplicitamente che si _tratta di una variabile.
TRiG,

@TRiG che dire della risposta di Starx, che lo fa senza essere tl; dr?
Mathletics,

12

= + _ eseguirà il cast di _ in un numero.

Così

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

produrrebbe un numero.


9

Suppongo che intendi r = +_;? In tal caso, è la conversione del parametro in a Number. Dire che _è '12 .3 ', quindi +'12.3'ritorna 12.3. Quindi nell'istruzione quotata +_è assegnato a r.


6

_è solo un nome di variabile, passato come parametro di funzione hexbin.radiuse +convertirlo in numero

Lasciami fare un esempio uguale alla tua funzione.

var hexbin = {},r  ;

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

ed esegui questa funzione di esempio .. quali output

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 (true);

true boolean
1 number false

Risposta molto tardi ma molto bella +.
Grijesh Chauhan

5

Assegnerà un nuovo valore alla variabile del lato sinistro un numero.

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

Hai dimenticato un +prima del b.
Attila O.

1
grazie 4 che mi aiuta a scrivere una risposta positiva.
Amrendra

3

+_è quasi equivalente di parseFloat(_). Osserva che parseIntsi fermerà a caratteri non numerici come punto, mentre parshFloatnon lo farà.

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

Pochissime differenze:


Penso che in prima linea vuoi dire parseInr(_)invece di parseFloat(_) ?
Grijesh Chauhan,

1
No float, intendevo dire , perché parseInt si fermerà a caratteri non numerici, parshFloat no. EXP: parseFloat(2.4) = 2.4vs parseInt(2.4) = 2.
Brian,

3

In poche parole, +_ equivale a usare il costruttore Number () .

In effetti, funziona anche in date:

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

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


Ulteriori informazioni sono disponibili anche nella sezione MDN - Unary plus (+) :

L'operatore unario positivo precede il suo operando e restituisce il suo operando ma tenta di convertirlo in un numero, se non lo è già. Anche se la negazione unaria (-) può anche convertire i non numeri, il plus unario è il modo più rapido e preferito di convertire qualcosa in un numero, perché non esegue altre operazioni sul numero. Può convertire rappresentazioni di stringa di numeri interi e float, nonché i valori non di stringa true, false e null. Sono supportati numeri interi sia in formato decimale che esadecimale ("0x" prefissato). Sono supportati numeri negativi (anche se non per esadecimali). Se non è in grado di analizzare un determinato valore, verrà valutato in NaN.


2

In questa espressione:

r = +_;
  • '+' agisce qui come un operatore unario che tenta di convertire il valore dell'operando giusto. Non converte l'operando ma il valore valutato. Quindi _rimarrà "1" se era così originariamente, ma rdiventerà il numero puro.

Considera questi casi se si desidera applicare il + per la conversione numerica

+"-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

Tuttavia, è il convertitore numerico più veloce che difficilmente consiglierei di usarlo eccessivamente se non lo uso affatto. parseInt/parseFloatsono buone alternative più leggibili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.