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