JavaScript'te = + _ ne anlama geliyor?


252

JavaScript'te = + _ operatörünün ne anlama geldiğini merak ediyordum . Ödevler yapıyor gibi görünüyor.

Misal:

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

57
Bana eski iyi yaklaşım operatörü hatırlattı-->
ov

12
Burada + işleneni olarak _ olan tekli bir operatördür.
Pieter Witvoet

44
Görünüşe göre bir Perl programcısı varsayılan değişkeni bırakamadı ;-)
Michael Wild

4
İyi bir sözdizimi vurgulaması, soruyu cevaplamanıza yardımcı olacaktır.
hugo der hungrige

18
Gülen yüz yapabilirsinizx= +_+ 0;
tckmn

Yanıtlar:


396
r = +_;
  • +ne olursa olsun _bir sayıya dökmeye çalışır .
  • _yalnızca değişken adıdır (operatör değil), olabilir a, foovb.

Misal:

+"1"

"1" i saf 1 numaraya çevirir.

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

rşimdi 1, değil "1".

Ayrıca, Aritmetik İşleçler'deki MDN sayfasına göre :

Tekli artı işleci işleneninden önce gelir ve işlenenini değerlendirir, ancak henüz değilse bir sayıya dönüştürmeye çalışır . [...] Bu tamsayılar ve yüzen dize temsillerini, hem de olmayan dize değerleri dönüştürebilirsiniz true, falseve null. Hem ondalık hem de onaltılık ( "0x"önceden düzeltilmiş) formatlarda tamsayılar desteklenir. Negatif sayılar desteklenir (onaltılık için olmasa da). Belirli bir değeri ayrıştıramıyorsa, olarak değerlendirilir NaN.

Ayrıca,

unary plus, bir şeyi bir sayıya dönüştürmenin en hızlı ve tercih edilen yoludur


2
Mu + gerçekten ortalama bir sayıya döküm veya yok +_gerçekten ortalama 0+_, bu durumda _0 eklemeden önce atılmalı?
colincameron


17
@ c.cam108 - Hayır, benzer şekilde davranmıyorlar. Tekli artı değeri bir sayıya verir, ancak ikili artı şunu yapmaz: +'12' === 12(sonuç bir sayıdır), 0 + '12' === '012'(sonuç bir dizedir). Ancak buna dikkat edin 0 - '12' === -12.
Kobi

1
@juzerali Elbette, ama bu iyi bir uygulama değil.
Eklemeyi

Perl'in varsayılan değişkeni $ _ ile perlish görünüyor
Matthew Lock

95

Bir atama operatörü değildir.

  • _ sadece işleve iletilen bir parametredir.

    hexbin.radius = function(_) {
                    //       ^ It is passed here
        // ...
    };
    
  • Sonraki satırda r = +_; +bu değişken ( _) bir sayıya veya tamsayı değerine çevrilir ve değişkene atanırr

+=Operatör ile KONUŞMAYIN


54

=+aslında iki operatörleri =atama ve +ve _değişken adıdır.

sevmek:

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

Benim şu kodlar kullanılmasını göstermek için yardımcı olacaktır =+bir dönüştürme dize içine int .
misal:

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

çıkışlar 10

kullanımı: Yani burada aksi nedeniyle yint :5=+

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

çıkışlar 55

Nerede _bir değişkendir.

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

çıkışlar 10

Buna ek olarak, aynı şeyi elde edebileceğinizi bilmek de ilginç olacaktır ~(eğer string int string ise (float int'e yuvarlak olacaktır) )

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

ayrıca çıkışlar 10

~bitwise NOT: İşlenenin bitlerini tersine çevirir. Büyüklük değişikliği için iki kez yaptım.


1
Ben sık sık x|0int çift dönüştürmek için kullanın ; bununla birlikte bu '~' karakterini kullanmanın <2 ^ 32 rakamlarıyla sınırlandırma cezası vardır. + "2e15" bunu yapmaz.
Aki Suihkonen

@AkiSuihkonen Evet iyi Sanırım x|0o zaman daha da hızlı +. Doğru mu? güzel teknik :). (2) Sadece bir işaretin kullanılabileceği ~OP'yi göstermek +için kullanıyorum ( kendim kullanıyorum+ ).
Grijesh Chauhan

Söylemesi zor - jsperf var ama ölçmek isteyen biri var. OTOH bu iki operatörün tamamen farklı bir anlamı vardır. Sadece bir sayı gerektiriyorsa (tamsayı değil) '+' zaten bir karakter daha kısadır.
Aki Suihkonen

1
Aslında ben sadece test jsperf - 18M ops için '| 0', 19M ops için '+'; performans muhtemelen tarayıcıdan tarayıcıya değişecektir. jsperf.com/strtoint
Aki Suihkonen

1
@AkiSuihkonen Ah, sadece Firefox'ta jsperf testi yaptım, çok büyük fark .. |çok daha hızlı.
Tapirboy

16

Öyle değil =+. JavaScript'te, +bunu sayı olarak değiştirmek anlamına gelir.

+'32' 32 değerini döndürür.

+'a' NaN değerini döndürür.

Böylece isNaN(), sayı olarak değiştirilip değiştirilemeyeceğini kontrol etmek için kullanabilirsiniz.


16

Sinsi biri.

Anlaşılması gereken önemli nokta, buradaki alt çizgi karakterinin aslında bir operatör değil değişken bir isim olmasıdır .

Bunun önündeki artı işareti, alt çizginin pozitif sayısal değerini elde etmektir - yani alt çizgi değişkenini etkili bir şekilde int olarak dökümdür. Aynı etkiyi elde edebilirsiniz parseInt(), ancak artı işareti dökümü muhtemelen daha özlü olduğu için burada kullanılır.

Ve bu eşittir işaretini sadece standart bir değişken ataması olarak bırakır.

Deneyimli bir Javascript programcısı genellikle alt çizgiyi bir değişken olarak tanıyacağından muhtemelen kasten karıştırılmamalıdır. Ama bilmiyorsanız kesinlikle çok kafa karıştırıcı. Kesinlikle böyle yazmazdım; En iyi zamanlarda kısa anlamsız değişken adları hayranı değilim - JS kodunda kısa değişken adlarının yerden tasarruf etmek istiyorsanız, bir küçültücü kullanın; başlamak için kısa değişkenlerle yazmayın.


1
+1, burada açıkça _bir değişken olduğunu belirten tek kişi sizsiniz .
TRiG

@TRiG Peki ya Starx'ın cevabı ne olur?
Matematik

12

= + _ _ sayısını bir sayıya çevirir.

Yani

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

sayı çıktı.


9

Sanırım demek istiyorsun r = +_;? Bu durumda, parametrenin a Number. Söyle _'12 .3 ', sonra +'12.3'geri döner 12.3. Böylece alıntı yapılan ifadeye +_atanır r.


6

_yalnızca bir değişken adıdır, işlev parametresi olarak geçirilir hexbin.radiusve +sayıya verilir

İşlevin gibi bir örnek yapalım.

var hexbin = {},r  ;

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

ve bu örnek fonksiyonu çalıştırın.

heksbin.radius ("1");

1 string
1 number false 

heksbin. yarıçap (1);

1 number
1 number false

hekbin.radius ([]);

[] object
0 number false

hekbin.radius ('a');

a string
NaN number true

hekbin.radius ({});

Object {} object
NaN number true

hexbin.radius (gerçek);

true boolean
1 number false

Çok geç cevap verdim ama çok güzel cevap +.
Grijesh Chauhan

5

Sol taraftaki değişkene yeni bir değer atar.

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

Daha +önce unuttun b.
Attila O.

1
thanx 4 bir gud cevap yazmama yardım ediyor.
Amrendra

3

+_neredeyse eşdeğer bir parseFloat(_). parseIntBunun nokta gibi sayısal olmayan bir karakterde duracağını, oysa bunun olmayacağını gözlemleyin parshFloat.

TECRÜBE:

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

Tecrübe:

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

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

Çok az fark:


Bence ilk sırada söylemek parseInr(_)yerine parseFloat(_) ?
Grijesh Chauhan

1
Hayır demek istedim float, çünkü parseInt sayısal olmayan karakterde duracak, parshFloat durmayacak. EXP: parseFloat(2.4) = 2.4vs parseInt(2.4) = 2.
Brian

3

Basitçe söylemek gerekirse, Number () yapıcısını kullanmaya +_ eşdeğerdir .

Aslında, tarihlerde bile çalışır:

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

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


Daha fazla bilgi MDN - Unary plus (+) bölümünde de bulunabilir :

Tekli artı işleci işleneninden önce gelir ve işlenenini değerlendirir, ancak henüz değilse bir sayıya dönüştürmeye çalışır. Her ne kadar tekli olumsuzlama (-) sayı olmayanları da dönüştürebilirse de, tekli artı bir şeyi sayıya dönüştürmenin en hızlı ve tercih edilen yoludur, çünkü sayı üzerinde başka bir işlem yapmaz. Tamsayıların ve kayan noktaların dize temsillerini ve true, false ve null dize olmayan değerleri dönüştürebilir. Hem ondalık hem de onaltılık ("0x" önceden düzeltilmiş) biçimlerde tamsayılar desteklenir. Negatif sayılar desteklenir (onaltılık olmasa da). Belirli bir değeri ayrıştıramıyorsa, NaN olarak değerlendirilir.


2

Bu ifadede:

r = +_;
  • '+' burada doğru işlenenin değerini dönüştürmeye çalışan tekli bir operatör görevi görür . İşleneni değil, değerlendirilen değeri dönüştürür. Yani _"1" kalacak kadar orijinal ama rsaf sayı olacak.

Sayısal dönüşüm için + uygulamak isteyip istemediğinizi düşünün.

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

Yine de, hiç kullanmazsanız, aşırı kullanmak için tavsiye edemeyeceğim en hızlı sayısal dönüştürücü. parseInt/parseFloatdaha iyi okunabilir alternatiflerdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.