Зачем вы ссылаетесь на новую дату без круглых скобок?

Я только что увидел этот фрагмент, случайно открыв инструменты для разработчиков в 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, и синтаксис без столбцов определенно является незаконным для вызова функции.