Мы можем опустить скобки при создании объекта с помощью оператора "new"?



Я видел объекты создаются таким образом:



const obj = new Foo;


но я думал, что скобки не являются обязательными при создании объекта:



const obj = new Foo();


является ли Первый способ создания объектов допустимым и определенным в стандарте ECMAScript? Есть ли различия между первым способом создания объектов и более поздним? Один предпочтительнее другого?

429   6  

6 ответов:

цитирую Дэвид Флэнаган1:

как частный случай, для JavaScript упрощает грамматику, позволяя опустить скобки, если в вызове функции нет аргументов. Вот несколько примеров использования new оператор:

o = new Object;  // Optional parenthesis omitted here
d = new Date();  

...

лично я всегда использую скобки, даже если конструктор не принимает аргументов.

В дополнение, JSLint может задеть ваши чувства, если вы опустите скобки. Он сообщает Missing '()' invoking a constructor, и, похоже, нет возможности для инструмента терпеть пропуск скобок.


1 Дэвид Флэнаган: JavaScript окончательное руководство: 4-е издание (стр. 75)

есть различия между ними:

  • new Date().toString() прекрасно работает и возвращает текущую дату
  • new Date.toString() бросает "TypeError: Дата.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 …       ║
╚════════════╩═════════════════════════════╩═══════════════╩═════════════╝

из этой таблицы следует, что:

  1. new Foo() имеет более высокий приоритет, чем new Foo

    new Foo() имеет тот же приоритет, что и . оператор

    new Foo имеет на один уровень более низкий приоритет, чем . оператор

    new Date().toString() прекрасно работает, потому что он оценивает как (new Date()).toString()

    new Date.toString() бросает "TypeError: Дата.toString не является конструктором", поскольку . имеет более высокий приоритет, чем new Date (и выше, чем "вызов функции"), и выражение оценивается как (new (Date.toString))()

    та же логика может быть применена к … [ … ] оператора.

  2. new Foo и справа-налево ассоциативность и new Foo() "ассоциативность" неприменима. Я думаю, что на практике это не имеет никакого значения. Для получения дополнительной информации см. этой поэтому вопрос


является одним предпочтительным по сравнению с другие?

зная все это, можно предположить, что new Foo() предпочтительнее.

Я не думаю, что есть какая-либо разница, когда вы используете оператор "new". Будьте осторожны с этой привычкой, так как эти две строки кода не совпадают:

var someVar = myFunc; // this assigns the function myFunc to someVar
var someOtherVar = myFunc(); // this executes myFunc and assigns the returned value to someOtherVar

Если у вас нет аргументов, то круглые скобки являются необязательными. Опустить их-это просто синтаксический сахар.

https://people.mozilla.org/~jorendorff/es6-draft.html#sec-new-operator-runtime-semantics-evaluation

вот часть спецификации ES6, которая определяет, как работают два варианта. Вариант без скобок передает пустой список аргументов.

интересно, что эти две формы имеют разные грамматические значения. Это происходит, когда вы пытаетесь получить доступ к элементу результата.

new Array.length // fails because Array.length is the number 1, not a constructor
new Array().length // 0

нет никакой разницы между двумя.

Comments

    Ничего не найдено.