Існують відмінності між цими двома:
new Date().toString()
працює чудово і повертає поточну дату
new Date.toString()
кидає " TypeError: Date.toString не є конструктором "
Це відбувається тому, що new Date()
і new Date
мають різний пріоритет. Згідно з MDN частина таблиці пріоритетів оператора JavaScript, яка нас цікавить, виглядає так:
╔════════════╦═════════════════════════════╦═══════════════╦═════════════╗
║ 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 … ║
╚════════════╩═════════════════════════════╩═══════════════╩═════════════╝
З цієї таблиці випливає, що:
new Foo()
має вищий пріоритет ніж new Foo
new Foo()
має той же пріоритет, що і .
оператор
new Foo
має на один рівень нижчий пріоритет, ніж .
оператор
new Date().toString()
працює чудово, оскільки він оцінює як (new Date()).toString()
new Date.toString()
кидає " TypeError: Date.toString не є конструктором ", оскільки .
має перевагу вищеnew Date
(і вище "Function Call"), а вираз оцінюється як(new (Date.toString))()
Така ж логіка може бути застосована і до … [ … ]
оператора.
new Foo
має право-наліво асоціативність і для new Foo()
"асоціативності" не застосовується. Я думаю, що на практиці це не має ніякого значення. Для отримання додаткової інформації дивіться це запитання щодо ТАК
Чи один віддає перевагу іншому?
Знаючи все це, можна припустити, що new Foo()
перевагу.