2010-05-20 2 views
10

아래의 코드를 참조하십시오. 주석 처리 된 줄 중 하나에 "주석으로 추가"할 때 IE ("예상 됨")의 오류가 발생합니다. 그럼 내 결론은 정확하다.이 무능력은 객체 값에 대한 참조를 문자열 리터럴의 객체 키로 제공 할 수 없다. 이것은 엄격하게 통역사/파싱 문제입니까? 이것은 Crockford의 "좋은 부분"과 달리 Javascript의 끔찍한 (또는 적어도 "나쁜"부분) "부분"에 대한 후보입니까?이 Javascript 개체 리터럴 키 제한은 파싱으로 인한 것입니까?

<script> 
var keys = {'ONE': 'one'}; 

//causes error: 
//var obj1 = {keys.ONE: 'value1'}; 
//var obj1 = {keys['ONE']: 'value1'}; 

//works 
var obj1 = {}; 
obj1[keys.ONE] = 'value1'; 

//also works 
var key_one = keys.ONE; 
var obj2 = {key_one: 'value1'}; 
</script> 
가 문자열 이름으로 해석되는 문자는 변수 이름

objectname[anythingThatReturnsValue]='value1'; 동안 사용할 경우에만 구성 할 수 있습니다 따라서 {}

와 객체를 정의 할 때 키와 같은 변수를 사용할 수 없습니다

+1

BTW'VAR key_one = keys.ONE; var obj2 = {key_one : 'value1'};'예상대로 작동하지 않습니다. 'obj2'의 속성은'key_one'이 될 것이고'key.ONE'의 값이 아니라'one'이 될 것입니다. – RoToRa

+1

마지막 예제가 효과가 있지만, 'keys.one'속성이 아닌 'key_one' 속성으로 객체를 생성한다는 점에 유의하십시오. 변수'key_one'는 다음 줄의 리터럴 객체와 관련이 없습니다. – Guffa

+0

잡았습니다 .... 혼란 스러울 수 있습니다 ... "인용되지 않은"문자열을 모두 허용하지 않거나 참조가 무엇이든 상관없이 참조를 해제해야합니다. –

답변

15

리터럴 객체 구문의 제한은 이름이 리터럴이어야한다는 것입니다. 이름은 식별자뿐만 아니라 문자열로 지정 될 수 있기 때문에 대신 변수를 사용할 수 없습니다.

var n = 'answer'; 
var o = { n: 42 }; 
+0

숫자 리터럴도 유효한 속성 이름입니다. 또한, ES5에서, 이름은 식별자 이름 (즉, 식별자뿐만 아니라 예약어)으로 지정 될 수있다. http://stackoverflow.com/a/9568622/96656을 참조하십시오. –

6

가야할 길입니다.

는 또한

당신은 문자열을 생성하고 분석 할 수 그것을

var s='{"'+keys.ONE+'": "value1"}'; 
var obj=JSON.parse(s); 
//or 
s='var obj2='+s; 
eval(s); 

모두 위의 방법은 자바 스크립트의 객체를 생성하는 나쁜 관행이며, 내가 그들을하지 않는 것이 좋습니다.

+0

변수를 사용할 수 있습니다. {}로 객체를 정의 할 때 키로 두 번째 "작품"블록을 참조하십시오. –

+1

@ George : 아니, 할 수 없습니다. 코드가 실행되지만 리터럴 개체의 변수는 사용되지 않습니다. – Guffa

+0

@George : 그는 '구문 오류'를 의미하며 그것에 대해 할 수있는 것이 아무것도 없습니다 :) –

2

그것에 대해 생각 :

은 속성이 아니라 answer, 속성 n로 객체를 생성 할 것이다 당신이 그것을 완전히 언어의 모호성을 소개 할 원하는 방식으로 작동한다면.

var obj = {something:"red"} 
var obj = {"something":"red"} 

키워드 키는 "자동 인용"이므로 두 문은 JavaScript에서 동일합니다. 따라서 something이 리터럴 문자열 "something"을 의미하는 경우 변수 "something"을 참조 할 수도 있습니다. 그것은 할 수 없다. 따라서 변수를 사용하려면 key : value 표기법 대신 대괄호 표기법을 사용해야합니다.

1

당신이 시도 할 수 :

var obj = {}; 
var val = 'foo'; 

obj[val] = 'bar'; 

obj.foo >>> 'bar'; 
관련 문제