이런 식으로 객체가 생성되는 것을 보았습니다.
const obj = new Foo;
그러나 객체를 만들 때 괄호는 선택 사항이 아니라고 생각했습니다.
const obj = new Foo();
이전의 객체 생성 방법이 ECMAScript 표준에 유효하고 정의되어 있습니까? 이전의 객체 생성 방식과 이후의 방식간에 차이점이 있습니까? 하나는 다른 것보다 선호됩니까?
답변
인용 David Flanagan 1 :
특별한 경우,
new
연산자의 경우에만 JavaScript는 함수 호출에 인수가없는 경우 괄호를 생략 할 수 있도록하여 문법을 단순화합니다.new
연산자를 사용하는 몇 가지 예는 다음과 같습니다 .o = new Object; // Optional parenthesis omitted here d = new Date(); ...
개인적으로, 생성자가 인수를 취하지 않아도 항상 괄호를 사용합니다.
또한 괄호를 생략하면 JSLint 가 감정을 상하게 할 수 있습니다. 그것은보고 Missing '()' invoking a constructor
하고 도구가 괄호 생략을 허용하는 옵션이없는 것 같습니다.
1 David Flanagan : JavaScript the Definitive Guide : 4th Edition (페이지 75)
답변
둘 사이에는 차이점이 있습니다.
new Date().toString()
완벽하게 작동하고 현재 날짜를 반환합니다new Date.toString()
” 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()
” TypeError : Date.toString is a constructor ”.
이 발생합니다new Date
( “Function Call” 보다 우선 순위가 높음 ).(new (Date.toString))()
… [ … ]
운영자 에게 동일한 논리를 적용 할 수 있습니다 . -
new Foo
한 오른쪽에서 왼쪽으로 연관성 및 위해new Foo()
“연관성”은 적용되지 않습니다. 실제로는 아무런 차이가 없다고 생각합니다. 자세한 내용은 이 SO 질문을 참조하십시오
하나는 다른 것보다 선호됩니까?
모든 것을 알면 new Foo()
선호되는 것으로 가정 할 수 있습니다 .
답변
“새”연산자를 사용할 때 차이가 없다고 생각합니다. 이 두 줄의 코드는 동일하지 않으므로이 습관에주의하십시오.
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
답변
둘 사이에는 차이가 없습니다.