İkisi arasında farklılıklar vardır:
new Date().toString()
mükemmel çalışıyor ve geçerli tarihi döndürüyor
new Date.toString()
" TypeError: Date.toString bir kurucu değil "
Bu olur new Date()
ve new Date
farklı önceliğe sahiptir. MDN'ye göre , JavaScript operatör öncelik tablosunun ilgilendiğimiz kısmı aşağıdaki gibidir:
╔════════════╦═════════════════════════════╦═══════════════╦═════════════╗
║ Precedence ║ Operator type ║ Associativity ║ Operators ║
╠════════════╬═════════════════════════════╬═══════════════╬═════════════╣
║ 18 ║ Member Access ║ left-to-right ║ … . … ║
║ ║ Computed Member Access ║ left-to-right ║ … [ … ] ║
║ ║ new (with argument list) ║ n/a ║ new … ( … ) ║
╠════════════╬═════════════════════════════╬═══════════════╬═════════════╣
║ 17 ║ Function Call ║ left-to-right ║ … ( … ) ║
║ ║ new (without argument list) ║ right-to-left ║ new … ║
╚════════════╩═════════════════════════════╩═══════════════╩═════════════╝
Bu tablodan aşağıdakileri takip edin:
new Foo()
önceliği daha yüksektir new Foo
new Foo()
.
operatörle aynı önceliğe sahiptir
new Foo
.
operatörden bir seviye daha düşük önceliğe sahiptir
new Date().toString()
mükemmel çalışıyor çünkü (new Date()).toString()
new Date.toString()
" TypeError: Date.toString bir yapıcı değildir " atar çünkü .
önceliği new Date
(ve "İşlev Çağrısı" ndan daha yüksek önceliğe sahiptir ) ve ifade şu şekilde değerlendirilir:(new (Date.toString))()
Aynı mantık … [ … ]
operatöre uygulanabilir .
new Foo
olan sağdan sola birleşim ve için new Foo()
"çağrışımsallık" uygulanamaz. Bence pratikte herhangi bir fark yaratmıyor. Ek bilgi için bu SO sorusuna bakın
Biri diğerine tercih edilir mi?
Tüm bunları bilerek new Foo()
, tercih edildiği varsayılabilir .