Saya ingin menambahkan elemen array ke yang lain, jadi saya mencoba ini:
[1,2] + [3,4]
Itu merespons dengan:
"1,23,4"
Apa yang sedang terjadi?
Saya ingin menambahkan elemen array ke yang lain, jadi saya mencoba ini:
[1,2] + [3,4]
Itu merespons dengan:
"1,23,4"
Apa yang sedang terjadi?
[5,6,7][1,2]
adalah7
karena menggunakan item terakhir dalam array kedua. OoJawaban:
The
+
Operator tidak didefinisikan untuk array .Yang terjadi adalah Javascript mengubah array menjadi string dan menggabungkannya.
Memperbarui
Karena pertanyaan ini dan akibatnya jawaban saya mendapatkan banyak perhatian, saya merasa akan bermanfaat dan relevan untuk memiliki gambaran umum tentang bagaimana
+
operator berperilaku secara umum juga.Jadi begini saja.
Tidak termasuk E4X dan hal-hal implementasi khusus, Javascript (per ES5) memiliki 6 built-in tipe data :
Perhatikan bahwa meskipun
typeof
agak membingungkanobject
untuk Null danfunction
untuk Obyek yang bisa dipanggil, Null sebenarnya bukan Obyek dan secara tegas, dalam implementasi Javascript yang sesuai spesifikasi semua fungsi dianggap sebagai Objek.Itu benar - Javascript tidak memiliki array primitif seperti itu; hanya contoh dari Obyek yang disebut
Array
dengan gula sintaksis untuk meringankan rasa sakit.Menambah lebih banyak kebingungan, entitas pembungkus seperti
new Number(5)
,new Boolean(true)
dannew String("abc")
semuanyaobject
bertipe, bukan angka, boolean atau string seperti yang mungkin diharapkan. Meskipun demikian untuk operator aritmatikaNumber
danBoolean
berperilaku sebagai angka.Mudah kan? Dengan semua itu, kita bisa beralih ke ikhtisar itu sendiri.
Jenis hasil yang berbeda dari
+
jenis operan* berlaku untuk Chrome13, FF6, Opera11 dan IE9. Memeriksa browser dan versi lain dibiarkan sebagai latihan untuk pembaca.
Catatan: Seperti yang ditunjukkan oleh CMS , untuk kasus tertentu objek seperti
Number
,Boolean
dan yang khusus,+
operator tidak harus menghasilkan hasil string. Ini dapat bervariasi tergantung pada implementasi objek ke konversi primitif. Sebagai contohvar o = { valueOf:function () { return 4; } };
mengevaluasio + 2;
menghasilkan6
, sebuahnumber
, mengevaluasio + '2'
menghasilkan'42'
, sebuahstring
.Untuk melihat bagaimana tabel ikhtisar dihasilkan kunjungan http://jsfiddle.net/1obxuc7m/
sumber
JavaScript
+
memiliki dua tujuan: menambahkan dua angka, atau menggabungkan dua string. Itu tidak memiliki perilaku spesifik untuk array, jadi itu mengubah mereka menjadi string dan kemudian bergabung dengan mereka.Jika Anda ingin bergabung dua array untuk menghasilkan yang baru, menggunakan yang
.concat
metode sebagai gantinya:Jika Anda ingin secara efisien menambahkan semua elemen dari satu array ke array lainnya, Anda perlu menggunakan metode .push :
Perilaku
+
operator didefinisikan dalam ECMA-262 5e Bagian 11.6.1 :Anda dapat melihat bahwa setiap operan dikonversi
ToPrimitive
. Dengan membaca lebih lanjut kita dapat menemukan bahwaToPrimitive
array akan selalu dikonversi ke string, menghasilkan hasil ini.sumber
Array.prototype.push.apply(data, [3, 4])
alih-alihdata.concat([3,4])
?concat
menghasilkan Array baru , semakin lama panggilan efisien memperpanjang Array yang ada .[].push.apply(data, [3,4])
-kata yang sedikit kurang. Juga, yang dijamin tahan terhadap orang lain mengubah nilaiArray
.Ini menambahkan dua array seolah-olah mereka adalah string .
Representasi string untuk array pertama adalah "1,2" dan yang kedua adalah "3,4" . Jadi ketika
+
tanda ditemukan, itu tidak bisa menjumlahkan array dan kemudian menggabungkannya sebagai string.sumber
The
+
concats string, sehingga mengubah array ke string.Untuk menggabungkan array, gunakan
concat
.sumber
Dalam JavaScript, operator penambahan biner (
+
) melakukan penambahan numerik dan penggabungan string. Namun, ketika argumen pertama bukan angka atau string maka itu mengubahnya menjadi string (karenanya "1,2
") maka ia melakukan hal yang sama dengan yang kedua "3,4
" dan menyatukan mereka menjadi "1,23,4
".Coba gunakan metode "concat" dari Arays:
sumber
Ini mengubah array individu menjadi string, kemudian menggabungkan string.
sumber
Sepertinya JavaScript mengubah array Anda menjadi string dan menggabungkannya. Jika Anda ingin menambahkan tupel bersama, Anda harus menggunakan fungsi lingkaran atau peta.
sumber
[1,2]+[3,4]
dalam JavaScript sama dengan mengevaluasi:dan untuk mengatasi masalah Anda, hal terbaik adalah menambahkan dua array di tempat atau tanpa membuat array baru:
sumber
Itu melakukan persis seperti yang Anda minta.
Apa yang Anda tambahkan bersama adalah referensi array (yang dikonversi JS ke string), bukan angka seperti yang terlihat. Ini agak seperti menambahkan string bersama:
"hello " + "world"
="hello world"
sumber
akan lebih baik jika Anda bisa membebani operator di JavaScript tetapi Anda tidak bisa: Dapatkah saya menentukan kelebihan operator kustom dalam Javascript? Anda hanya dapat meretas operator "==" yang mengonversi menjadi string sebelum membandingkan: http://blogger.xs4all.nl/peterned/archive/2009/04/01/462517.aspx
sumber
Itu karena, + operator mengasumsikan bahwa operan adalah string, jika bukan angka. Jadi, pertama-tama mengubahnya menjadi string dan concats untuk memberikan hasil akhir, jika bukan angka. Juga, itu tidak mendukung array.
sumber
Beberapa jawaban di sini telah menjelaskan bagaimana output yang tidak diinginkan yang tidak diharapkan (
'1,23,4'
) terjadi dan beberapa telah menjelaskan bagaimana mendapatkan apa yang mereka anggap sebagai output yang diinginkan ([1,2,3,4]
), yaitu array concatenation. Namun, sifat dari output yang diinginkan sebenarnya agak ambigu karena pertanyaan aslinya hanya menyatakan "Saya ingin menambahkan elemen-elemen dari array ke yang lain ...". Itu bisa berarti array array tetapi juga bisa berarti penambahan tuple (misalnya di sini dan di sini ), yaitu menambahkan nilai skalar elemen dalam satu array ke nilai skalar elemen yang sesuai di elemen kedua, misalnya menggabungkan[1,2]
dan[3,4]
mendapatkan[4,6]
.Dengan asumsi kedua array memiliki arity / panjang yang sama, berikut adalah satu solusi sederhana:
sumber
Hasil lain hanya dengan menggunakan tanda "+" sederhana adalah:
Jadi sesuatu seperti ini seharusnya bekerja (tapi!):
... tetapi itu akan mengubah variabel dari Array ke String! Ingatlah itu.
sumber