Apa perbedaan nyata antara mendeklarasikan array seperti ini:
var myArray = new Array();
dan
var myArray = [];
javascript
arrays
declaration
Amr Elgarhy
sumber
sumber
[]
token:ARRAY_INIT
;new Array
token:NEW, IDENTIFIER
;new Array()
token:NEW, IDENTIFIER, CALL
Jawaban:
Ada perbedaan, tetapi tidak ada perbedaan dalam contoh itu.
Menggunakan metode yang lebih verbose:
new Array()
memang memiliki satu opsi tambahan dalam parameter: jika Anda meneruskan angka ke konstruktor, Anda akan mendapatkan array dengan panjang itu:Untuk mengilustrasikan berbagai cara membuat array:
Perbedaan lainnya adalah ketika menggunakan
new Array()
Anda dapat mengatur ukuran array, yang memengaruhi ukuran stack. Ini dapat berguna jika Anda mendapatkan stack overflows ( Performance of Array.push vs Array.unshift ) yang terjadi ketika ukuran array melebihi ukuran stack, dan harus dibuat ulang. Jadi sebenarnya bisa, tergantung pada kasus penggunaan, menjadi peningkatan kinerja saat menggunakannew Array()
karena Anda dapat mencegah terjadinya overflow.Seperti yang ditunjukkan dalam jawaban ini ,
new Array(5)
tidak akan benar-benar menambahkan limaundefined
item ke array. Itu hanya menambah ruang untuk lima item. Sadarilah bahwa menggunakanArray
cara ini membuat sulit untuk mengandalkanarray.length
perhitungan.sumber
Perbedaan antara membuat array dengan array implisit dan konstruktor array adalah halus tetapi penting.
Saat Anda membuat array menggunakan
Anda memberi tahu juru bahasa untuk membuat array runtime baru. Tidak perlu pemrosesan ekstra sama sekali. Selesai
Jika Anda menggunakan:
Anda memberi tahu penerjemah, saya ingin memanggil konstruktor "
Array
" dan menghasilkan sebuah objek. Kemudian mencari melalui konteks eksekusi Anda untuk menemukan konstruktor untuk memanggil, dan memanggilnya, membuat array Anda.Anda mungkin berpikir, "Yah, ini tidak masalah sama sekali. Mereka sama!". Sayangnya Anda tidak bisa menjamin itu.
Ambil contoh berikut:
Pada contoh di atas, panggilan pertama akan mengingatkan 'SPARTA' seperti yang Anda harapkan. Yang kedua tidak. Anda akhirnya akan melihat tidak terdefinisi. Anda juga akan mencatat bahwa b berisi semua fungsi objek Array asli seperti
push
, di mana yang lain tidak.Meskipun Anda mungkin berharap ini terjadi, itu hanya menggambarkan fakta itu
[]
tidak sama dengannew Array()
.Mungkin lebih baik menggunakan saja
[]
jika Anda tahu Anda hanya menginginkan sebuah array. Saya juga tidak menyarankan berkeliling dan mendefinisikan ulang Array ...sumber
Ada perbedaan penting yang belum ada jawaban.
Dari ini:
Anda mungkin berpikir
new Array(2)
itu setara dengan[undefined, undefined]
, tapi BUKAN!Mari kita coba dengan
map()
:Lihat? Semantiknya benar-benar berbeda! Jadi mengapa demikian?
Menurut ES6 Spec 22.1.1.2, pekerjaan
Array(len)
hanya menciptakan array baru yang propertinyalength
diatur ke argumenlen
dan hanya itu, artinya tidak ada elemen nyata di dalam array yang baru dibuat ini.Fungsinya
map()
, sesuai dengan spec 22.1.3.15 pertama-tama akan memeriksaHasProperty
lalu memanggil callback, tetapi ternyata:Dan itu sebabnya Anda tidak bisa mengharapkan fungsi iterasi bekerja seperti biasa pada array yang dibuat
new Array(len)
.BTW, Safari dan Firefox memiliki "pencetakan" yang jauh lebih baik untuk situasi ini:
Saya telah mengirimkan masalah ke Chromium dan meminta mereka untuk memperbaiki pencetakan yang membingungkan ini: https://bugs.chromium.org/p/chromium/issues/detail?id=732021
PEMBARUAN: Sudah diperbaiki. Chrome sekarang dicetak sebagai:
sumber
[...Array(2)]
yang setara dengan[undefined, undefined]
dari sudut pandang hasil.undefined
seperti biasa.Anehnya,
new Array(size)
hampir 2x lebih cepat dari[]
di Chrome, dan hampir sama di FF dan IE (diukur dengan membuat dan mengisi array). Itu hanya masalah jika Anda tahu perkiraan ukuran array. Jika Anda menambahkan lebih banyak item daripada panjang yang Anda berikan, peningkatan kinerja hilang.Lebih akurat:
Array(
adalah operasi waktu konstan cepat yang tidak mengalokasikan memori, sedangkan[]
operasi waktu linier yang menetapkan jenis dan nilai.sumber
new Array(length)
pada 0 <= size <= ~ 1000, pada size> ~ 1000 menang[]
Untuk informasi lebih lanjut, halaman berikut menjelaskan mengapa Anda tidak perlu menggunakannya
new Array()
Lihat juga komentar -
new Array(length)
formulir tidak memiliki tujuan yang bermanfaat (setidaknya dalam implementasi JavaScript saat ini).sumber
Untuk lebih memahami
[]
dannew Array()
:Hasil di atas adalah dari konsol Google Chrome pada Windows 7.
sumber
Array(3)
ataunew Array(3)
tidak sama dengan[3]
.Yang pertama adalah panggilan konstruktor objek default. Anda dapat menggunakan parameter itu jika Anda mau.
Yang kedua memberi Anda kemampuan untuk membuat array tidak kosong:
sumber
var array = [5]
menggunakan kurung kotak tetapi tidak menggunakan konstruktor karenavar array = Array(5)
membuat array kosong 5 elemen.Saya bisa menjelaskan dengan cara yang lebih spesifik dimulai dengan contoh ini yang didasarkan pada Fredrik yang bagus.
Saya baru saja menambahkan nilai lain ke array, dan membuat empat peringatan: Yang pertama dan kedua adalah untuk memberi kita nilai yang disimpan dalam setiap array, untuk memastikan tentang nilai-nilai. Mereka akan mengembalikan yang sama! Sekarang coba yang ketiga, ini mengembalikan false, itu karena
Perbedaan pertama adalah ketika kita memanggil test1 ia memanggil variabel tanpa berpikir, itu hanya mengembalikan nilai yang disimpan dalam variabel ini tanpa menghiraukan tipe datanya! Tetapi, ketika kita memanggil test2, ia memanggil fungsi Array () dan kemudian menyimpan nilai "Pushed" kami di properti "Value" -nya , dan hal yang sama terjadi ketika kita mengingatkan test2, ia mengembalikan "Value" dari objek array.
Jadi ketika kita memeriksa apakah test1 sama dengan test2 tentu saja mereka tidak akan pernah mengembalikan true, satu adalah fungsi dan yang lainnya adalah variabel (dengan jenis array), bahkan jika mereka memiliki nilai yang sama!
Untuk memastikannya, coba peringatan ke-4, dengan nilai. Ditambahkan ke dalamnya; itu akan mengembalikan true. Dalam hal ini kami memberi tahu JS "Mengabaikan jenis wadah, apakah itu berfungsi atau variabel, harap bandingkan nilai yang disimpan di setiap wadah dan beri tahu kami apa yang telah Anda lihat!" itulah yang terjadi.
Saya harap saya mengatakan ide di balik itu dengan jelas, dan maaf untuk bahasa Inggris saya yang buruk.
sumber
[]
dannew Array()
identik;.value
akanundefined
di kedua kasus, dan membandingkan mereka akan selalu salah.array.value
. dan keduanyatypeof []
dantypeof new Array()
kembaliobject
. Itu salah satu alasan mengapa ada fungsi yang disebutArray.isArray
Tidak ada perbedaan ketika Anda menginisialisasi array tanpa panjang. Begitu
var a = []
&var b = new Array()
sama.Tetapi jika Anda menginisialisasi array dengan panjang seperti
var b = new Array(1);
, itu akan mengatur panjang objek array menjadi 1. Jadi setara denganvar b = []; b.length=1;
.Ini akan menjadi masalah setiap kali Anda melakukan array_object.push, itu menambah item setelah elemen terakhir & menambah panjang.
vs.
sumber
Yang pertama adalah panggilan konstruktor objek default. Kebanyakan digunakan untuk nilai dinamis.
array kedua digunakan saat membuat nilai statis
sumber
Tidak ada perbedaan besar, mereka pada dasarnya melakukan hal yang sama tetapi melakukannya dengan cara yang berbeda, tetapi baca terus, lihat pernyataan ini di W3C:
dan
Tetapi pada saat yang sama, membuat array baru menggunakan
new Array
sintaksis dianggap sebagai praktik yang buruk:Jadi pada dasarnya tidak dianggap sebagai praktik terbaik, juga ada satu perbedaan kecil di sana, Anda bisa melewati panjang
new Array(length)
seperti ini, yang juga bukan cara yang disarankan.sumber
new Array(40).fill(123)
Perbedaan menggunakan
Atau
Seperti yang sudah cukup dibahas dalam pertanyaan ini.
Saya ingin menambahkan masalah kecepatan - cara tercepat saat ini , pada
google chrome
adalah yang kedua.Tetapi perhatikan, hal-hal ini cenderung banyak berubah dengan pembaruan. Juga waktu menjalankan akan berbeda antara browser yang berbeda.
Misalnya - opsi ke-2 yang saya sebutkan, berjalan pada 2 juta [ops / detik] aktif
chrome
, tetapi jika Anda ingin mencobanyamozilla dev.
Anda akan mendapatkan tingkat yang mengejutkan lebih tinggi yaitu 23 juta.Bagaimanapun, saya sarankan Anda memeriksanya, sesekali, pada browser yang berbeda (dan mesin), menggunakan situs seperti itu
sumber
Seperti yang saya tahu perbedaannya, Anda dapat menemukan slice (atau fungsi-fungsi lain dari Array) seperti code1. Dan code2 menunjukkan kepada Anda Array dan instance- nya :
kode1:
kode2:
kesimpulan:
seperti yang Anda lihat
[]
dannew Array()
buat contoh baru dari Array. Dan mereka semua mendapatkan fungsi prototipe dariArray.prototype
Mereka hanya contoh berbeda dari Array. Jadi ini menjelaskan mengapa
[] != []
:)
sumber
Saya mengalami perilaku aneh menggunakan [].
Kami memiliki "kelas" Model dengan bidang yang diinisialisasi ke beberapa nilai. Misalnya:
Saya menemukan bahwa ketika bidang diinisialisasi dengan
[]
maka akan dibagikan oleh semua objek Model. Membuat perubahan pada satu mempengaruhi semua yang lain.Ini tidak terjadi dengan menginisialisasi mereka
new Array()
. Sama untuk inisialisasi Objek ({}
vs baruObject()
)TBH Saya tidak yakin apakah ini masalah dengan kerangka kerja yang kami gunakan ( Dojo )
sumber
Ada lebih dari ini yang bisa dilihat mata. Sebagian besar jawaban lain benar, TAPI JUGA ..
new Array(n)
n
elemen[1, 2, 3] || []
delete
atau[1,,3]
sintaksis)for ..
,forEach
,map
, dll)sumber
Saya telah menemukan satu perbedaan antara dua konstruksi yang menggigit saya cukup sulit.
Katakanlah saya punya:
Dalam kehidupan nyata, jika saya melakukan ini:
Yang akhirnya saya dapatkan adalah ini:
Saya tidak tahu spesifikasi bahasa apa yang seharusnya terjadi, tetapi jika saya ingin dua objek saya memiliki array properti unik di objek saya, saya harus menggunakan
new Array()
.sumber
[]
dannew Array()
konstruktor array yang menghasilkan satu item per array per properti. Anda harus memiliki sesuatu yang lain terjadi dalam kode Anda untuk berakhir dengan hasil yang Anda tunjukkan di atas.var property1static=[];
function MyClass(){ this.property1=property1static; this.property2=new Array(); };
Menggunakan konstruktor Array membuat array baru dengan panjang yang diinginkan dan mengisi masing-masing indeks dengan tidak terdefinisi, array yang ditetapkan ke variabel membuat indeks yang Anda berikan info untuknya.
sumber