Есть различия между ними:
new Date().toString()
работает отлично и возвращает текущую дату
new Date.toString()
бросает « Ошибка типа: 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
(и выше, чем «вызов функции»), и выражение оценивается как(new (Date.toString))()
Та же логика может быть применена к … [ … ]
оператору.
new Foo
имеет ассоциативность справа налево и для new Foo()
«ассоциативности» не применим. Я думаю, что на практике это не имеет никакого значения. Для получения дополнительной информации см этот вопрос так
Один предпочтительнее другого?
Зная все это, можно предположить, что new Foo()
это предпочтительнее.