Co oznacza = + _ w JavaScript

252

Zastanawiałem się, co oznacza operator = + _ w JavaScript. Wygląda na to, że wykonuje zadania.

Przykład:

hexbin.radius = function(_) {
   if (!arguments.length)
       return r;
   r = +_;
   dx = r * 2 * Math.sin(Math.PI / 3);
   dy = r * 1.5;
   return hexbin;
};
Dimitry
źródło
57
Przypomniał mi stare dobre podejście operatora-->
ov
12
+ Tutaj jest operatorem jednoargumentowym, z operandem _.
Pieter Witvoet
44
Wygląda na to, że programista Perla nie mógł puścić domyślnej zmiennej ;-)
Michael Wild
4
Dobre wyróżnianie składni pomogłoby ci odpowiedzieć na pytanie.
hugo der hungrige
18
Możesz zrobić uśmiechniętą buźkęx= +_+ 0;
tckmn

Odpowiedzi:

396
r = +_;
  • +próbuje rzucić cokolwiek _na liczbę.
  • _jest tylko nazwa zmiennej (nie operator), to może być a, fooitd.

Przykład:

+"1"

rzuć „1” na czysty numer 1.

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

rjest teraz 1nie "1".

Ponadto, zgodnie ze stroną MDN na temat operatorów arytmetycznych :

Jednoargumentowy operator plus poprzedza swój operand i analizuje jego operand, ale próbuje przekształcić go w liczbę, jeśli jeszcze nie jest . [...] Może konwertować reprezentacje ciąg liczb całkowitych i pływaków, jak również wartości innych niż ciąg true, falsei null. "0x"Obsługiwane są liczby całkowite w formacie dziesiętnym i szesnastkowym (z prefiksem). Obsługiwane są liczby ujemne (choć nie dla heksadecymalnego). Jeśli nie może przeanalizować określonej wartości, oceni to NaN.

Należy również zauważyć, że

unary plus to najszybszy i preferowany sposób konwersji czegoś na liczbę

mpm
źródło
2
Czy + naprawdę oznacza rzut na liczbę, czy tak +_naprawdę oznacza 0+_, w którym przypadku _należy rzutować przed dodaniem do 0?
colincameron
3
@ c.cam108 Zobacz stronę MDN na jednoargumentowym operatorze plus .
lonesomeday
17
@ c.cam108 - Nie, nie zachowują się podobnie. Unary plus rzutuje wartość na liczbę, ale binarny plus nie: +'12' === 12(wynik jest liczbą), ale 0 + '12' === '012'(wynik jest łańcuchem). Zauważ jednak, że 0 - '12' === -12.
Kobi
1
@juzerali Pewnie, ale to nie jest dobra praktyka. Spróbuj użyć dodatku;)
Izkata
Wygląda na wygasłą z domyślną zmienną perla $ _
Matthew Lock
95

To nie jest operator przypisania.

  • _ jest tylko parametrem przekazanym do funkcji.

    hexbin.radius = function(_) {
                    //       ^ It is passed here
        // ...
    };
  • W następnym wierszu r = +_; +infront rzutuje tę zmienną ( _) na wartość liczbową lub całkowitą i przypisuje ją do zmiennejr

NIE WOLNO MÓWIĆ GO z +=operatorem

Starx
źródło
54

=+są rzeczywiście dwa operatory =jest przypisanie a +i _jest nazwa zmiennej.

lubić:

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

Moje poniższe kody pomogą ci pokazać użycie =+do konwersji ciągu na int .
przykład:

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

wyjścia 10

use: Więc tutaj yjest int z 5powodu =+
inaczej:

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

wyjścia 55

Gdzie as _jest zmienną.

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

wyjścia 10

Dodatkowo, byłoby interesujące wiedzieć, że możesz również osiągnąć to samo ~(jeśli string jest int string (float będzie zaokrąglony do int) )

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

również wyjścia 10

~jest bitowe NIE: Odwraca bity swojego operandu. Zrobiłem dwa razy bez zmiany wielkości.

Grijesh Chauhan
źródło
1
Często używam x|0do konwersji podwójnej na int; jednak to, podobnie jak użycie „~”, ma karę ograniczenia do liczb <2 ^ 32. + „2e15” nie.
Aki Suihkonen
@AkiSuihkonen Tak dobrze Wierzę, że x|0jest jeszcze szybszy +. Prawidłowa ? niezła technika :). (2) Używam ~tylko, aby pokazać OP, że +nie tylko znak może być użyty ( ja sam używam+ ).
Grijesh Chauhan
Trudno powiedzieć - istnieje jsperf, ale trzeba to zmierzyć. OTOH ci dwaj operatorzy mają zupełnie inne znaczenie. Jeśli wymaganie tylko liczby (a nie liczby całkowitej) „+” jest tak czy inaczej o jeden znak krótszy.
Aki Suihkonen
1
Właściwie właśnie przetestowałem to jsperf - 18 milionów operacji dla „| 0”, 19 milionów operacji dla „+”; wydajność prawdopodobnie będzie się różnić w zależności od przeglądarki. jsperf.com/strtoint
Aki Suihkonen
1
@AkiSuihkonen O rany, właśnie zrobiłem test jsperf w Firefoksie, ogromna różnica ... |dużo szybciej.
Tapirboy
16

To nie jest =+. W JavaScript +oznacza zmianę na liczbę.

+'32' zwraca 32.

+'a' zwraca NaN.

Możesz więc użyć, isNaN()aby sprawdzić, czy można go zmienić na liczbę.

Ovilia
źródło
16

Jest podstępny.

Ważne jest, aby zrozumieć, że znak podkreślenia jest w rzeczywistości nazwą zmiennej , a nie operatorem.

Znakiem dodatkowym przed tym jest uzyskanie dodatniej wartości liczbowej podkreślenia - tj. Efektywne rzutowanie zmiennej podkreślenia na liczbę całkowitą. Możesz osiągnąć ten sam efekt parseInt(), ale prawdopodobnie używasz tutaj znaku plus, ponieważ jest bardziej zwięzły.

To pozostawia znak równości jako zwykłe przypisanie zmiennej.

Prawdopodobnie nie jest on celowo wprowadzany w błąd, ponieważ doświadczony programista Javascript rozpoznaje podkreślenie jako zmienną. Ale jeśli nie wiesz, że jest to zdecydowanie bardzo mylące. Z pewnością nie napisałbym tego w ten sposób; W najlepszym wypadku nie jestem fanem krótkich, pozbawionych znaczenia nazw zmiennych - jeśli chcesz, aby krótkie nazwy zmiennych w kodzie JS oszczędzały miejsce, użyj minizera; nie pisz tego krótkimi zmiennymi na początek.

SDC
źródło
1
+1, ponieważ jesteś tu jedynym, który wyraźnie wskazuje, że _jest to zmienna.
TRiG
@TRiG co z odpowiedzią Starx, która robi to bez bycia tl; dr?
Mathletics
12

= + _ rzuci _ na liczbę.

Więc

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

wypisze liczbę.

Harsha Ivaturi
źródło
9

Chyba masz na myśli r = +_;? W takim przypadku jest to konwersja parametru na a Number. Powiedz „ _12,3”, a następnie +'12.3'powróci 12.3. Tak więc w cytowanym zestawieniu +_przypisano r.

KooiInc
źródło
6

_to po prostu nazwa zmiennej, przekazywana jako parametr funkcji hexbin.radiusi +wylewana na liczbę

Pozwól mi zrobić przykład taki sam jak twoja funkcja.

var hexbin = {},r  ;

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

i uruchom tę przykładową funkcję ... która wyprowadza

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
rab
źródło
Odpowiedzi bardzo późno, ale bardzo ładna odpowiedź +.
Grijesh Chauhan
5

Przydzieli nową wartość zmiennej po lewej stronie liczbę.

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
źródło
Zapomniałeś +wcześniej b.
Attila O.
1
thanx 4 pomaga mi napisać odpowiedź gud.
Amrendra,
3

+_jest prawie równoważne z parseFloat(_). Zauważ, że parseIntzatrzyma się na znakach nienumerycznych, takich jak kropka, podczas gdy parshFloatnie.

Termin ważności:

    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

Bardzo niewiele różnic:

Brian
źródło
Myślę, że w pierwszej linii chcesz powiedzieć parseInr(_)zamiast parseFloat(_) ?
Grijesh Chauhan
1
Nie miałem na myśli float, ponieważ parseInt zatrzyma się na znakach nienumerycznych, parshFloat nie. EXP: parseFloat(2.4) = 2.4vs parseInt(2.4) = 2.
Brian
3

Mówiąc najprościej, +_ jest równoważne z użyciem konstruktora Number () .

W rzeczywistości działa nawet w terminach:

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

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


Więcej informacji można również znaleźć w sekcji MDN - Unary plus (+) :

Jednoargumentowy operator plus poprzedza swój operand i analizuje jego operand, ale próbuje przekształcić go w liczbę, jeśli jeszcze nie jest. Chociaż jednoargumentowa negacja (-) może również konwertować liczby nieparzyste, jednoargumentowy plus jest najszybszym i preferowanym sposobem konwersji czegoś na liczbę, ponieważ nie wykonuje żadnych innych operacji na liczbie. Może konwertować reprezentacje ciągu liczb całkowitych i liczb zmiennoprzecinkowych, a także wartości nie łańcuchowe true, false i null. Obsługiwane są liczby całkowite w formacie dziesiętnym i szesnastkowym (z prefiksem „0x”). Obsługiwane są liczby ujemne (choć nie dla heksadecymalnego). Jeśli nie może przeanalizować konkretnej wartości, będzie oceniać na NaN.

Dom
źródło
2

W tym wyrażeniu:

r = +_;
  • „+” działa tutaj jako jednoargumentowy operator, który próbuje przekonwertować wartość właściwego operandu. Nie konwertuje operandu, ale wartość obliczoną. _Pozostanie więc „1”, jeśli tak było pierwotnie, ale rstanie się czystą liczbą.

Rozważ te przypadki, czy chcesz zastosować znak + do konwersji numerycznej

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

Chociaż jest to najszybszy konwerter numeryczny, raczej nie polecam go nadużywać, jeśli w ogóle z niego skorzystasz. parseInt/parseFloatsą dobrymi, bardziej czytelnymi alternatywami.

Arman McHitarian
źródło