2010-01-15 5 views

답변

11

, 두 가지 방법이 거의 해당하는, 당신은 모두를 사용할 수 있지만 인용되지 않은 키를 사용하여 예를 들어 당신이 예약 된 키워드의 이름을 가진 속성을 정의 할 수 버전 :

// valid 
var obj = { 
    'for': 'test' 
}; 

// SyntaxError 
var obj = { 
    for: 'test' 
}; 

JSON standard은 사양별로 quoted keys 만 사용할 수 있습니다.

편집 : 이제 확인해 보겠습니다.

Object initializer의 문법은 다음과 같은 방법으로 정의됩니다

 
ObjectLiteral : 
    {} 
    { PropertyNameAndValueList } 

PropertyNameAndValueList : 
    PropertyName : AssignmentExpression 
    PropertyNameAndValueList , PropertyName : AssignmentExpression 

그리고 PROPERTYNAME 토큰이 될 수 있습니다

 
PropertyName : 
    Identifier 
    StringLiteral 
    NumericLiteral 

그것이 식별자 경우, 그것은 꽤 분명 사양에 따라 Reserved Word 일 수 없으므로 다음과 같이 표시됩니다.

,363,210
 
7.5.1 Reserved Words 
Description 

Reserved words cannot be used as identifiers. 

그리고, Identifier 문법의 첫 번째 정의는 다음과 같습니다

 
Identifier :: 
    IdentifierName but not ReservedWord 
+0

그 이유는 무엇입니까? – user198729

+2

+1 CMS, 훌륭한 답변입니다. @unknown 따옴표없이 예약어를 사용할 수 없습니다. 참조 용 목록은 다음과 같습니다. https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Reserved_Words –

+0

하나는 사전에 키로 사용되는 문자열이고 다른 하나는 언어로 구문 분석되는 토큰입니다 그런 다음 사전에 문자열로 사용됩니다. –

1

나는 일반적으로 인용 키와 값 모두 안전 할 수 있습니다. 일부 키워드 및 기타 제약 조건은 따옴표가없는 경우 키에 오류를 유발할 수 있습니다.

3

첫 번째 방법은 완벽하지만 가끔 예약 된 키워드 인 속성을 선언 할 때 두 번째 방법을 사용해야합니다.

따옴표는 항상 문자열입니다. 그렇지 않으면 해석기가 이것을 문자/키워드 변수로 해석 할 수 있습니다.

3

작은 따옴표 대신 큰 따옴표를 사용하면 두 번째 값은 JSON과 호환됩니다.

+0

JSON은 작은 따옴표가 아닌 키 주위에 큰 따옴표 만 허용합니다. http://json.org/ – James

+0

감사합니다. OP 코드를 간과했습니다. – YOU

2

문자열이나 식별자를 사용하여 개체의 속성을 지정할 수 있습니다. 다음과 같이 혼합 할 수도 있습니다.

var o = { 'id': 1, name: 'test'} 

두 가지 방법 모두 동일한 결과를 제공합니다 (문자열을 사용할 때 키워드와 구분 기호를 사용할 수도 있습니다). 당신이 속성을 읽을 식별자 또는 문자열을 사용할 수있는 유사한 방법으로

: 속성이 문자열을 사용하여 만든

alert(o.id); 
alert(o['name']); 

참고가 있다고 보여 식별자와 그 반대를 사용하여 읽을 수 있습니다 속성을 만들고 액세스하는 다양한 방법 만 사용하면 결과 속성은 해당 속성을 만드는 방법에 관계없이 동일합니다.

0

이와 같은 개체를 정의 할 때 식별자 또는 변수를 선언하는 것입니다. 식별자에는 여가 시간에 ECMAScript specification에서 체크 아웃 할 수있는 특정 규칙이 있지만 두 형식 모두 동일합니다. 그러나 예약 된 키워드 나 앞으로 예약 된 키워드를 사용하려고하면 브라우저가 다르게 작동합니다. 예를 들어 식별자로 사용할 수 없습니다.

break 
do 
instanceof 
typeof 
case 
else 
new 
var 
catch 
finally 
return 
void 
continue 
for 
switch 
while 
debugger 
function 
this 
with 
default 
if 
throwdelete 
in 
try 

일부 브라우저는 오류로 표시되지만 일부는 그렇지 않을 수도 있습니다. 그리고 미래의 예약 된 키워드 목록이 너무있다 :

class 
enum 
extends 
super 
const 
export 
import 

는 안전하고, 당신의 식별자를 인용하기 위해 더 말할 것마다 사양을 찾아 볼 필요하지 않으려면. 이 문제를 실제로 확인하려면 최소한 4.0.4 버전의 Safari에서이 키워드 중 하나를 식별자로 사용할 때 em을 확인하십시오. 예를 들어, 이러한 시도 :

var class = "my class"; 

단순한 선언이나 JSON 형식 개체 선언 내에서 작동하지 않습니다 :

var myObject = { 
    goodProperty: "this works", 
    class: "gimmeh the errarz codez!", 
}; 
관련 문제