왜 eval 에서 json 대상 문자열 을 변환 할 때 괄호 를 넣 어야 합 니까?

1653 단어 Javascript
서버 와 인 터 랙 션 데 이 터 를 만 들 때 저 희 는 보통 Ajax 요청 을 한 다음 에 서버 는 '{x: 1, y: 1}' 과 같은 구조의 json 문자열 을 되 돌려 줍 니 다. 클 라 이언 트 처 리 를 편리 하 게 하기 위해 저 희 는 이 를 대상 으로 직접 양 으로 변환 합 니 다. 이 는 eval 을 통 해 이 루어 질 때 가 많 습 니 다.
var jsonstr = '{x : 1, y : 1}';
var jsonobj = eval('(' + jsonstr + ')');

eval 때 괄호 를 넣 지 않 으 면 스 크 립 트 오류 가 발생 합 니 다. 왜 일 까요?
eval 은 실행 환경 이기 때문에 괄호 를 사용 하지 않 을 때 {x: 1, y: 1} 전체 가 하나의 복합 구문 으로 해석 되 었 습 니 다. {와} 은 여기 서 우리 가 원래 생각 하 는 대상 이 직접 재 는 문법 방식 이 아니 라 구문 에 맞 는 구분자 입 니 다.우리 가 일반적으로 if (true) {x = 1;} 을 쓰 는 것 처럼 이곳 의 대괄호 도 복합 문장의 역할 을 한다.다음 x: 일반적으로 사용 하 는 swicth case 문장의 case x 와 같이 라벨 로 해석 되 며, 라벨 의 다른 용법 은 관련 자 료 를 참고 할 수 있 습 니 다.뒤의 1 은 하나의 숫자 로 직접 양 이 되 었 고 Y 가 변수 표시 자로 해석 되 었 다가 Y 후의 사칭 을 계속 해석 할 때 오류 가 발생 했 습 니 다. 식별 할 수 없 기 때 문 입 니 다.따라서 eval ({x: 1, y = 1}) 이 라 고 쓰 면 잘못 보고 하지 않 을 것 입 니 다. y = 1 은 식별 할 수 있 기 때 문 입 니 다. y = 1 후 eval 의 결 과 는 1 로 되 돌아 갑 니 다.그런데 왜 앞 뒤에 괄호 를 넣 으 면 되 는 거 죠? 괄호 는 여기 서 강제 집행, 전체 '(' + ') 를 표시 하기 때 문 입 니 다. jsonStr + ')' 는 복합 구문 이 아 닌 표현 식 연산 으로 해석 되 기 때문에 jsonStr 의 대괄호 {} 은 대상 으로 하 는 문법 으로 인식 되 기 때문에 당연히 된다.
위 에 말 이 끝나 면 예 를 하나 더 보 겠 습 니 다. 만약 에 우리 가 eval ({x: 1}) 을 쓰 면 이것 은 잘못 보 고 될 까요?
정 답 은 아 닙 니 다. {x: 1} 은 복합 문 으로 여 겨 지지 만 x: 1 이라는 표기 법 은 옳 습 니 다. 라벨 로 인식 되 기 때문에 결 과 는 1 로 되 돌아 갑 니 다. 즉, {...} 에 표 시 된 복합 문 구 를 해석 하지 못 하 게 하면 됩 니 다. 예 를 들 어 {x: 1, y = 1, z = 6} 은 잘못 보고 하지 않 고 마지막 결과 6 으로 돌아 갑 니 다.
PS: 서버 가 json 배열 문자열 의 구 조 를 되 돌려 줄 때 "[{x: 1, y: 2}]" 와 같이 eval () 을 직접 사용 하여 변환 하 는 것 은 문제 가 없습니다.
var josnstr = "[{x:1,y=2}]";
var jsonarr = eval(jsonstr);

좋은 웹페이지 즐겨찾기