Saya telah melihat objek yang dibuat dengan cara ini:
const obj = new Foo;
Tetapi saya berpikir bahwa tanda kurung tidak opsional ketika membuat objek:
const obj = new Foo();
Apakah cara sebelumnya untuk membuat objek valid dan didefinisikan dalam standar ECMAScript? Apakah ada perbedaan antara cara sebelumnya membuat objek dan kemudian? Apakah yang satu lebih disukai daripada yang lain?
javascript
new-operator
Behrang Saeedzadeh
sumber
sumber
new a.b()
berbeda dengannew a().b()
, dalam hal itu, dalam kasusa.b
yang pertama, pertama kali diakses, sedangkan dalam kasus yang terakhir, yang barua
dibuat terlebih dahulu.Jawaban:
Mengutip David Flanagan 1 :
Secara pribadi, saya selalu menggunakan tanda kurung, bahkan ketika konstruktor tidak mengambil argumen.
Selain itu, JSLint dapat melukai perasaan Anda jika Anda menghilangkan tanda kurung. Ini melaporkan
Missing '()' invoking a constructor
, dan sepertinya tidak ada pilihan untuk alat untuk mentolerir penghilangan kurung.1 David Flanagan: JavaScript the Definitive Guide: Edisi ke-4 (halaman 75)
sumber
new Class
untuk konstruktor tanpa parameter. Jika ini tidak mengeja 'pendapat', saya tidak tahu apa yang ...new Object.func()
TIDAK setara dengannew Object().func()
. Dengan selalu menyertakan tanda kurung, kemungkinan membuat kesalahan ini dihilangkan.(new Object).func()
. Tapi saya mempertimbangkan menggunakan tanda kurung tambahan dan tanda-tanda ekstra sama, seperti dalam==
vs===
, alasan buruk untuk tidak belajar bahasa Anda.Ada perbedaan di antara keduanya:
new Date().toString()
berfungsi dengan baik dan mengembalikan tanggal saat ininew Date.toString()
throws " TypeError: Date.toString bukan konstruktor "Itu terjadi karena
new Date()
dannew Date
memiliki prioritas yang berbeda. Menurut MDN bagian dari tabel prioritas operator JavaScript yang kami minati terlihat seperti:Dari tabel ini berikut bahwa:
new Foo()
memiliki prioritas lebih tinggi daripadanew Foo
new Foo()
memiliki prioritas yang sama dengan.
operatornew Foo
memiliki prioritas satu tingkat lebih rendah daripada.
operatornew Date().toString()
berfungsi dengan baik karena dievaluasi sebagai(new Date()).toString()
new Date.toString()
melempar " TypeError: Date.toString bukan konstruktor " karena.
memiliki prioritas lebih tinggi daripadanew Date
(dan lebih tinggi dari "Function Call") dan ekspresi dievaluasi sebagai(new (Date.toString))()
Logika yang sama dapat diterapkan ke
… [ … ]
operator.new Foo
memiliki associativity kanan-ke-kiri dan untuknew Foo()
"associativity" tidak berlaku. Saya pikir dalam praktiknya tidak ada bedanya. Untuk informasi tambahan, lihat pertanyaan SO iniMengetahui semua itu, dapat diasumsikan
new Foo()
lebih disukai.sumber
new Foo()
harus lebih disukainew Foo
. Jawaban terbaik sejauh ini.new Object().something()
juga(new Object()).something()
.(new Date).toString()
, jumlah karakter yang sama, dan lebih eksplisit daripadanew Date().toString
.Saya tidak berpikir ada perbedaan ketika Anda menggunakan operator "baru". Hati-hati dengan kebiasaan ini, karena dua baris kode ini TIDAK sama:
sumber
Jika Anda tidak memiliki argumen untuk diteruskan, tanda kurung opsional. Menghilangkan mereka hanyalah gula sintaksis.
sumber
https://people.mozilla.org/~jorendorff/es6-draft.html#sec-new-operator-runtime-semantics-evaluation
Inilah bagian dari spesifikasi ES6 yang mendefinisikan bagaimana kedua varian beroperasi. Varian tanpa tanda kurung melewati daftar argumen kosong.
Menariknya, kedua bentuk tersebut memiliki makna tata bahasa yang berbeda. Ini muncul ketika Anda mencoba mengakses anggota hasil.
sumber
Tidak ada perbedaan di antara keduanya.
sumber