Зачем вы ссылаетесь на новую дату без круглых скобок?
Я только что увидел этот фрагмент, случайно открыв инструменты для разработчиков в Gmail:
var GM_TIMING_END_CHUNK1=(new Date).getTime();
Я обычно ожидал бы что-то вроде этого, так как довольно необычно вызывать конструктор без круглых скобок (по крайней мере, я его до сих пор не видел):
var GM_TIMING_END_CHUNK1=new Date().getTime();
или
var GM_TIMING_END_CHUNK1=Date.now(); //newer browsers
Есть ли какое-либо преимущество в этом, любая разница в поведении? Это то же самое количество символов, которое необходимо, поэтому краткость не будет причиной.
Ответы
Ответ 1
Вы можете вызывать конструкторы в JS без скобок, если параметры не должны передаваться, эффект один и тот же.
new Date()
vs new Date
то же самое.
Однако, это имеет значение, если вы хотите вызвать метод для результирующего объекта:
new Date().getTime()
работает, но new Date.getTime()
не будет, потому что в последнем случае интерпретатор предполагает, что getTime
является методом типа Date, но это не так, getTime
является методом экземпляра - существует только в построенных объектах. Чтобы преодолеть это, вы можете заключить скобки вокруг вызова конструктора, чтобы сообщить интерпретатору, что это выражение:
(new Date).getTime()
В этом случае сначала выражение оценивается, а getTime
вызывается в результате, который является экземпляром Date.
Ответ 2
В дополнение к существующим комментариям о необязательных круглых скобках - т.е. new Date() <==> new Date
- обратите внимание также, что Date.now
является статическим методом. То есть объект Date
никогда не создается. Этот метод является свойством самого конструктора Date
. Таким образом, он отличается от двух других примеров.
В качестве стиля я предпочитаю включать все необязательные parens для согласованности и ясности:
(new Date()).getTime()
Ответ 3
Когда функция используется как конструктор объекта и никакие аргументы не передаются, скобки являются необязательными. d = new Date;
означает то же, что и d = new Date();
.
Ответ 4
В обоих утверждениях нет разницы, скобки являются необязательными, поэтому обычно программисты бросают его.
В вашем втором примере:
new Date().getTime();
один из лучших программистов-практиков следует для обертывания объекта в скобках перед вызовом функции или свойства. поэтому это будет:
(new Date()).getTime();
как обсуждалось выше, объектная скобка является необязательной. Таким образом, более короткий код очистки:
(new Date).getTime();
Ответ 5
Возможно, вы захотите посмотреть на этот ответ:
Можем ли мы опускать круглые скобки при создании объекта с помощью" new " оператор?
В основном new Date
эквивалентно написанию new Date()
, хотя вы можете использовать new Date()
для согласованности, поскольку функции и конструкторы настолько похожи в JavaScript, и синтаксис без столбцов определенно является незаконным для вызова функции.