개체 속성 이름으로 템플릿 문자열


80

JavaScript가 템플릿 문자열을 객체 속성 키로 허용하지 않는 이유는 무엇입니까? 예를 들어 다음을 입력 할 때 :

foo = {`bar`: 'baz'}

NodeJS REPL SyntaxError에 긴 스택 추적이 포함 된 "예기치 않은 템플릿 문자열"을 던집니다 . 그러나 속성 값은 괜찮지 만 예상치 못한 것은 아닙니다. 브라우저에서 유사한 오류가 발생합니다. 예를 들어 Firebug는 SyntaxError"유효하지 않은 속성 ID"와 함께를 발생시킵니다.

"계산 된 속성 이름"에는 템플릿 문자열이 허용됩니다. 예를 들어, 이것은 구문을 지원하는 모든 브라우저에서 완벽하게 잘 컴파일됩니다.

var foo = {
    [`bar` + 1]: `baz`
};

그리고 객체를 만듭니다 {"bar1": "baz"}.

템플릿 문자열이 리터럴 객체 키로 허용되지 않는 이유는 무엇입니까? 성능상의 이유입니까? 템플릿 문자열은 런타임에 컴파일되어야합니다 (틀린 경우 수정). 즉,이 객체를 만날 때마다 인터프리터가 객체 이름을 계산해야합니다. "cooked"템플릿 문자열과 같은 것들을 고려하면, ES5 이후로 getter와 setter가 있었지만 느려질 수있는 것처럼 보입니다. Firefox는 이것을 오류로 언급하지 않기 때문에 예상치 못한 것으로 나타났습니다. 구문이 향후 언젠가 허용됩니까?


2
그 이유가 아니라 계산 된 속성 이름이 도입되었습니다. 예, 그 주위에 중괄호가 필요하지만 구문 적으로 다양한 시나리오를 다루는 일반적인 솔루션으로 더 좋습니다.
Praveen Puglia

나는 내 대답을 다시 생각하고 있으며 그것이 옳았는지 너무 확신하지 못합니다. 이제 ES6 문서를 살펴보고 있습니다 ....
Max

템플릿 문자열이 리터럴 객체 키로 허용되지 않는 이유는 무엇입니까? 그들은 단지 구문이 잘못되었습니다 ...?
Mathletics

답변:


70

템플릿 문자열이 리터럴 객체 키로 허용되지 않는 이유는 무엇입니까?

템플릿 문자열은 리터럴이 아닌 표현식입니다 1 . 속성 이름에는 문자열 리터럴 (및 식별자) 만 사용할 수 있으며, 그 밖의 모든 항목 (정적이라고 알려지지 않음)에는 계산 된 속성 이름이 필요합니다.

성능상의 이유입니까?

아니요, 그럴 것 같지 않습니다. 구문 분석을 용이하게하고 상수 (정적으로 알려진) 속성 이름과 동적으로 계산 된 속성 이름을 쉽게 구분할 수 있습니다.

그리고 대부분은 아무도 필요로하지 않는 기능입니다. 어떤 것도 단순화하거나 단축하지 않으며,이를 통해 달성 할 수있는 것은 이미 가능합니다.

구문이 향후 언젠가 허용됩니까?

아니.

1 : "템플릿 리터럴"이라고 불리더라도 기술적으로는 리터럴 이 아닙니다 . 그리고 템플릿은 문자열이 아니어도되고 무엇이든 평가할 수 있습니다.


2
`var obj = {`$ {dyanmicKey}`: val}`은 어떻습니까?
b4d4r

78
@ b4d4r : 아니요-계산 된 속성을 사용해야합니다. 어느 var obj = {[`${dyanmicKey}`]: val}하거나 var obj = {[dyanmicKey]: val}.
Bergi

그래도 왜 안돼. 그들은 단지 사람들이 ... 거기에 응에 표현을 넣어 싶지 않아
geoyws

@Bergi 어떻게 다음을 고칠까요?profile.preferences.networks[${network.name}]
basickarl

1
@SafalPillai 인용되지 않은 식별자 이름 안에는 없지만 {"#key": "value"}완전히 괜찮습니다.
Bergi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.