Apa yang dimaksud dengan + + dalam JavaScript?

252

Saya bertanya-tanya apa arti operator = + _ dalam JavaScript. Sepertinya itu memang tugas.

Contoh:

hexbin.radius = function(_) {
   if (!arguments.length)
       return r;
   r = +_;
   dx = r * 2 * Math.sin(Math.PI / 3);
   dy = r * 1.5;
   return hexbin;
};
Dimitry
sumber
57
Mengingatkan saya pada operator pendekatan lama yang baik-->
Ov
12
+ Di sini adalah operator unary, dengan _ sebagai operan.
Pieter Witvoet
44
Sepertinya seorang programmer Perl tidak bisa melepaskan variabel default ;-)
Michael Wild
4
Penyorotan sintaksis yang baik akan membantu Anda menjawab pertanyaan itu.
hugo der hungrige
18
Anda dapat membuat wajah tersenyumx= +_+ 0;
tckmn

Jawaban:

396
r = +_;
  • +mencoba untuk melemparkan apa pun _ke nomor.
  • _hanya nama variabel (bukan operator), bisa jadi a, foodll.

Contoh:

+"1"

cor "1" ke angka murni 1.

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

rsekarang 1, tidak "1".

Selain itu, menurut halaman MDN tentang Operator Aritmatika :

Operator plus unary mendahului operan dan mengevaluasi operan tetapi mencoba mengubahnya menjadi angka, jika belum . [...] Hal ini dapat mengkonversi representasi string bilangan bulat dan mengapung, serta nilai-nilai non-string true, falsedan null. Integer dalam format desimal dan heksadesimal ( "0x"-prefixed) didukung. Angka negatif didukung (meskipun tidak untuk hex). Jika tidak dapat menguraikan nilai tertentu, itu akan dievaluasi menjadi NaN.

Juga dicatat bahwa

unary plus adalah cara tercepat dan lebih disukai untuk mengubah sesuatu menjadi angka

mpm
sumber
2
Apakah + benar-benar berarti dilemparkan ke angka, atau apakah +_benar-benar berarti 0+_, dalam hal ini _harus dilemparkan sebelum menambahkan ke 0?
colincameron
3
@ c.cam108 Lihat halaman MDN pada operator unary plus .
lonesomeday
17
@ c.cam108 - Tidak, mereka tidak berlaku sama. Plus unary melemparkan nilai ke angka, tetapi biner plus tidak: +'12' === 12(hasil adalah angka), tetapi 0 + '12' === '012'(hasil adalah string). Perhatikan, bagaimanapun, itu 0 - '12' === -12.
Kobi
1
@juzerali Tentu, tapi itu bukan latihan yang bagus. Coba gunakan tambahan;)
Izkata
Tampak baik-baik saja dengan variabel default perl $ _
Matthew Lock
95

Ini bukan operator penugasan.

  • _ hanyalah parameter yang diteruskan ke fungsi.

    hexbin.radius = function(_) {
                    //       ^ It is passed here
        // ...
    };
    
  • Pada baris berikutnya r = +_; +infront melemparkan variabel itu ( _) ke angka atau nilai integer dan menugaskannya ke variabelr

JANGAN BINGUNG DENGAN +=operator

Starx
sumber
54

=+sebenarnya dua operator =adalah penugasan dan +dan _nama variabel.

Suka:

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

Kode berikut saya akan membantu Anda menunjukkan penggunaan =+untuk mengubah string menjadi int .
contoh:

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

keluaran 10

gunakan: Jadi di sini yint 5karena =+
jika tidak:

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

keluaran 55

Dimana as _adalah variabel.

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

keluaran 10

Selain itu, akan menarik untuk mengetahui bahwa Anda juga dapat mencapai hal yang sama dengan ~(jika string adalah string int (float akan bulat ke int) )

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

juga menghasilkan 10

~adalah bitwise NOT: Membalik bit operandnya. Saya melakukan dua kali tanpa perubahan besarnya.

Grijesh Chauhan
sumber
1
Saya sering menggunakan x|0untuk mengkonversi ganda ke int; namun ini juga menggunakan '~' memiliki hukuman pembatasan untuk angka <2 ^ 32. + "2e15" tidak.
Aki Suihkonen
@AkiSuihkonen Ya bagus saya percaya x|0itu lebih cepat +. Benar ? teknik yang bagus :). (2) Saya menggunakan ~hanya untuk menunjukkan OP yang +bukan hanya tanda yang dapat digunakan ( saya sendiri menggunakan+ ).
Grijesh Chauhan
Sulit dikatakan - ada jsperf, meskipun ada yang ingin mengukurnya. OTOH kedua operator ini memiliki arti yang sangat berbeda. Jika hanya membutuhkan angka (dan bukan bilangan bulat) '+' adalah satu karakter lebih pendek.
Aki Suihkonen
1
Sebenarnya saya baru saja mengujinya jsperf - 18M ops untuk '| 0', 19M ops untuk '+'; kinerjanya mungkin akan bervariasi dari browser ke browser. jsperf.com/strtoint
Aki Suihkonen
1
@AkiSuihkonen Ya ampun, baru saja melakukan tes jsperf di Firefox, perbedaan besar .. |jauh lebih cepat.
Tapirboy
16

Bukan itu =+. Dalam JavaScript, +berarti mengubahnya menjadi angka.

+'32' mengembalikan 32.

+'a' mengembalikan NaN.

Jadi, Anda dapat menggunakan isNaN()untuk memeriksa apakah itu dapat diubah menjadi angka.

Ovilia
sumber
16

Itu yang licik.

Yang penting untuk dipahami adalah bahwa karakter garis bawah di sini sebenarnya adalah nama variabel , bukan operator.

Tanda plus di depannya adalah mendapatkan nilai numerik positif garis bawah - yaitu secara efektif memasukkan variabel garis bawah menjadi int. Anda dapat mencapai efek yang sama dengan parseInt(), tetapi tanda tambah casting kemungkinan digunakan di sini karena lebih ringkas.

Dan itu hanya meninggalkan tanda sama dengan hanya tugas variabel standar.

Ini mungkin tidak sengaja ditulis untuk membingungkan, karena programmer Javascript yang berpengalaman umumnya akan mengenali garis bawah sebagai variabel. Tetapi jika Anda tidak tahu itu pasti sangat membingungkan. Saya tentu tidak akan menulis seperti itu; Saya bukan penggemar nama variabel pendek yang tidak berarti pada saat terbaik - Jika Anda ingin nama variabel pendek dalam kode JS untuk menghemat ruang, gunakan minifier; jangan menulisnya dengan variabel pendek untuk memulai.

SDC
sumber
1
+1, karena Anda satu-satunya di sini yang secara eksplisit menunjukkan bahwa itu _adalah variabel.
TRiG
@TRiG bagaimana dengan jawaban Starx, yang melakukannya tanpa tl; dr?
Mathletics
12

= + _ akan memasukkan _ menjadi angka.

Begitu

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

akan menampilkan nomor.

Harsha Ivaturi
sumber
9

Saya kira maksud Anda r = +_;? Jika demikian, konversi parameter ke a Number. Katakanlah _'12 .3 ', lalu +'12.3'kembali 12.3. Jadi dalam pernyataan dikutip +_ditugaskan untuk r.

KooiInc
sumber
6

_hanya nama variabel, dilewatkan sebagai parameter fungsi hexbin.radius, dan +dilemparkan ke dalam angka

Biarkan saya membuat exmple yang sama seperti fungsi Anda.

var hexbin = {},r  ;

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

dan jalankan fungsi contoh ini .. yang menghasilkan

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
sumber
Menjawab sangat terlambat tetapi jawaban yang sangat bagus +.
Grijesh Chauhan
5

Ini akan memberikan nilai baru ke variabel sisi kiri angka.

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
sumber
Anda lupa +sebelum b.
Attila O.
1
thanx 4 membantu saya menulis jawaban yang tepat.
Amrendra
3

+_hampir setara dengan parseFloat(_). Perhatikan bahwa parseIntakan berhenti pada karakter non numerik seperti titik, sedangkan parshFloattidak akan berhenti.

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

Sangat sedikit perbedaan:

Brian
sumber
Saya pikir di baris pertama yang ingin Anda katakan parseInr(_)bukan parseFloat(_) ?
Grijesh Chauhan
1
Tidak float, maksud saya , karena parseInt akan berhenti pada karakter non numerik, parshFloat tidak akan berhenti. EXP: parseFloat(2.4) = 2.4vs parseInt(2.4) = 2.
Brian
3

Sederhananya, +_ setara dengan menggunakan konstruktor Number () .

Bahkan, ia bekerja pada tanggal:

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

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


Informasi lebih lanjut juga dapat ditemukan di bagian MDN - Unary plus (+) :

Operator plus unary mendahului operan dan mengevaluasi operan tetapi mencoba mengubahnya menjadi angka, jika belum. Meskipun negasi unary (-) juga dapat mengkonversi non-angka, unary plus adalah cara tercepat dan lebih disukai untuk mengubah sesuatu menjadi angka, karena ia tidak melakukan operasi lain pada nomor tersebut. Ia dapat mengonversi representasi string dari integer dan float, serta nilai non-string true, false, dan null. Bilangan bulat dalam format desimal dan heksadesimal ("0x" -diperbaiki) didukung. Angka negatif didukung (meskipun tidak untuk hex). Jika tidak dapat menguraikan nilai tertentu, itu akan mengevaluasi ke NaN.

Dom
sumber
2

Dalam ungkapan ini:

r = +_;
  • '+' bertindak di sini sebagai operator unary yang mencoba mengonversi nilai operan yang tepat. Itu tidak mengubah operan tetapi nilai yang dievaluasi. Jadi _akan tetap "1" jika itu awalnya tetapi rakan menjadi angka murni.

Pertimbangkan kasus-kasus ini apakah seseorang ingin menerapkan + untuk konversi numerik

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

Padahal, ini adalah konverter angka tercepat yang saya hampir tidak menyarankan satu untuk menggunakannya secara berlebihan jika menggunakan sama sekali. parseInt/parseFloatadalah alternatif yang lebih baik dibaca.

Arman McHitarian
sumber