programing

"new" 연산자를 사용하여 개체를 만들 때 괄호를 생략할 수 있습니까?

copysource 2022. 10. 2. 15:42
반응형

"new" 연산자를 사용하여 개체를 만들 때 괄호를 생략할 수 있습니까?

다음과 같이 오브젝트가 생성되는 것을 본 적이 있습니다.

const obj = new Foo;

그러나 개체를 만들 때 괄호는 선택사항이 아니라고 생각했습니다.

const obj = new Foo();

오브젝트를 작성하는 앞의 방법이 유효하고 ECMAScript 표준에 정의되어 있습니까?이전의 오브젝트 작성 방법과 이후의 오브젝트 작성 방법 사이에 어떤 차이가 있습니까?한쪽이 다른 쪽보다 더 좋습니까?

David Flanagan1 인용:

로, ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★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: 제4판 (75페이지)

두 가지 사이에는 차이가 있습니다.

  • new Date().toString()합니다.
  • new Date.toString()"TypeError: Date.toString은 컨스트럭터가 아닙니다"를 슬로우합니다.

은 ★★★★★★★★★★★★★★★★★★★new Date() ★★★★★★★★★★★★★★★★★」new Date우선순위가 다르다MDN에 따르면 JavaScript 연산자 우선 순위 테이블 부분은 다음과 같습니다.

우선 순위 오퍼레이터 타입 연관성 연산자
18 액세스
Access ( 멤버액세스)
new 리스트 ('인수 리스트')
에서 오른쪽으로
에서 오른쪽으로
… . …
… [ … ]
new … ( … )
17 호출 " " "
new 리스트 ('인수 리스트')
에서 오른쪽으로
에서 왼쪽으로
… ( … )
new …

이 표에서는 다음과 같이 설명합니다.

  1. new Foo() 우선도가 new Foo

    new Foo()와 같은 우선순위를 가진다..

    new Fooprecedence '1'보다..

    new Date().toString()하게 동작합니다.(new Date()).toString()

    new Date.toString()는 "TypeError: Date.toString is not constructor" 를 슬로우합니다.이유는 다음과 같습니다.. 우선도가 new Date 호출) 은 ('함수 호출'보다 높음)으로 평가됩니다.(new (Date.toString))()

    할 수 .… [ … ]환입니니다다

  2. 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://262.ecma-international.org/6.0/ #sec-new-sec-sec-sec-sec-sec-sec-sec-

여기에서는, 2개의 변종이 어떻게 동작하는지를 정의하는 ES6 사양의 일부를 나타냅니다.no-parenthes 변종은 빈 인수 목록을 전달합니다.

흥미롭게도, 그 두 형태는 다른 문법적 의미를 가지고 있다.이것은 결과 멤버에 액세스하려고 할 때 표시됩니다.

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

그 둘 사이에는 차이가 없다.

언급URL : https://stackoverflow.com/questions/3034941/can-we-omit-parentheses-when-creating-an-object-using-the-new-operator

반응형