Istnieją różnice między tymi dwoma:
new Date().toString()
działa idealnie i zwraca bieżącą datę
new Date.toString()
rzuca "TypeError: Date.toString nie jest konstruktorem"
Zdarza się, ponieważ new Date()
i new Date
ha ve różne pierwszeństwo.Według MDN część JavaScript tabeli pierwszeństwa operator jesteśmy zainteresowani wygląda następująco:
╔════════════╦═════════════════════════════╦═══════════════╦═════════════╗
║ 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 … ║
╚════════════╩═════════════════════════════╩═══════════════╩═════════════╝
z tej tabeli wynika, że:
new Foo()
ma wyższy priorytet następnie new Foo
new Foo()
ma to samo pierwszeństwo, co .
operator
new Foo
ma jeden poziom niższy priorytet następnie .
operatora new Date().toString()
działa perfekcyjnie, ponieważ daje wartość (new Date()).toString()
new Date.toString()
generuje „Błąd typu: data.toString nie konstruktor”, ponieważ ma wyższy priorytet .
następnie new Date
(i wyższy niż "Wywołanie funkcji") i wyrażenie jest oceniane jako (new (Date.toString))()
Ta sama logika może być zastosowana do operatora … [ … ]
.
new Foo
ma prawo-lewo asocjatywność i new Foo()
"skojarzeń" nie ma zastosowania. Myślę, że w praktyce nie robi to żadnej różnicy. Aby uzyskać dodatkowe informacje, patrz this SO pytanie
Is one preferred over the other?
Wiedząc wszystko, co można przyjąć, że new Foo()
jest korzystne.
http://www.ecma-international.org/ecma-262/5.1/#sec-11.2.2 – SheetJS
Zaktualizowany numer referencyjny: ECMAScript 2017 [* §12.3.3 Nowy operator *] (http: // ecma -international.org/ecma-262/8.0/#sec-new-operator). – RobG