{x: 1}은 무엇으로 간주됩니까? — JavaScript 콘솔의 차이점
{}로 둘러싸인 코드 해석은 콘솔에 따라 다릅니다.
최근 JavaScript 객체 이니셜라이저(리터럴) 는 고기능이 되었습니다.
기법을 확인하기 위해 Node.js나 각종 브라우저 등의 콘솔(repl)에 코드를 입력해 보는 것도 많지 않을까요?
그러나 객체 이니셜라이저를 사용하여
{x: 1}
등을 입력해도 객체가 생성되지 않는 콘솔이 있습니다.예를 들어 Firefox이지만,
Firefox 콘솔에서
// 入力行
{x: 1}
// 表示行
1
됩니다.
Node.js와 Chrome의 콘솔이라면 객체가 생성되고,
Node.js의 콘솔에서
// 入力行
{x: 1}
// 表示行
{ x: 1 }
와 같이 표시되는데 왜 Firefox에서는
1
가 표시됩니까?{x: 1} 구문 트리
우선, 아무것도 없는 곳에
{x: 1}
라고만 쓴 경우, JavaScript에서는 본래 어떻게 구문 분석되는지를 확인합니다.esprima.org에 구문 분석하고 구문 트리를 보여주는 페이지가 있었으므로 입력해 보았습니다.
AST 발췌
"type": "BlockStatement",
"body": [
{
"type": "LabeledStatement",
"label": {
"type": "Identifier",
"name": "x"
},
"body": {
"type": "ExpressionStatement",
"expression": {
"type": "Literal",
"value": 1,
"raw": "1"
}
}
}
]
BlockStatement
( 블록문 ) 안에 x
라는 라벨이 붙은 LabeledStatement
( 레이블이 있는 문장 ) 가 있으며 그 내용이 1
Firefox 콘솔은 솔직한 동작을하고 있습니다.
즉, 아무것도 없는 장소에서 코드가
{ }
로 둘러싸여 있으면, 그것은 블록문으로 간주되는 것이 보통이며, Firefox의 콘솔은 그대로의 솔직한 동작을 하고 있는 것 같다.콘솔이 표시하는 것은 마지막으로 평가된 값이므로, 블록문과 라벨 첨부 문의 내용의 식,
1
가 평가되어 그대로 표시됩니다.{ }
로 둘러싸인 코드가 객체 이니셜라이저로 간주되는 것은, 값이 기대되는 장소에 놓여져 있는 경우입니다.예를 들어, 대입식의 우변(
foo = {x: 1}
), 괄호 안( ({x: 1})
)등, 많이 생각할 수 있습니다.Firefox에서도 이러한 코드를 콘솔에 입력하면
{x: 1}
라는 객체가 생성되어 표시됩니다.Node.js의 콘솔에는 편의를위한 장치가 있습니다.
위를 밟으면 Node.js와 Chrome 콘솔의 작동이 더 이상합니다.
{x: 1}
를 입력하면 객체 이니셜 라이저로 간주되는 이유는 무엇입니까?이것은 실은 간단한 장치로, 편리성을 위해 인치키를 하고 있는 것입니다.
Node.js의 내용( repl.js )을 살펴보면 입력 코드가
{ }
로 둘러싸여 있는 경우에 ( )
로 래핑하는 처리가 있습니다.repl.js (175 행 근처)
if (/^\s*\{/.test(code) && /\}\s*$/.test(code)) {
// It's confusing for `{ a : 1 }` to be interpreted as a block
// statement rather than an object literal. So, we first try
// to wrap it in parentheses, so that it will be interpreted as
// an expression.
code = `(${code.trim()})\n`;
wrappedCmd = true;
}
이 랩 된 코드를 퍼스 해 보면 안된다면, 오브젝트 이니셜라이저가 아닐까,라고 하는 것으로, 또 한번, 이번은 랩 없이 그대로 시험하는 것 같습니다.
repl.js (201 행 근처)
} catch (e) {
debug('parse error %j', code, e);
if (wrappedCmd) {
wrappedCmd = false;
// unwrap and try again
code = input;
wrappedErr = e;
continue;
}
블록 문, 객체 이니셜라이저 또는 해석을 제어하려면
{ }
로 둘러싸인 코드의 해석이 콘솔에 의해 다른 구조가 대체로 알았습니다.마지막으로 이 해석을 콘솔에 관계없이 명시적으로 선택하는 방법을 생각해 보았습니다.
객체 이니셜라이저로 해석하는 방법 :
// かっこで囲む
({x: 1})
// カンマ演算子の右に置く
1,{x: 1}
블록문으로 해석하는 방법:
// セミコロンを先頭か末尾に付ける
{x: 1};
이 기사의 라이센스
이 문서는 CC BY 4.0(크리에이티브 커먼즈 표시 4.0 국제 라이센스)에 게시됩니다.
관련 기사
JavaScript의 {} 이해 (사양서를 읽는 방법이 작성되었습니다.)
Reference
이 문제에 관하여({x: 1}은 무엇으로 간주됩니까? — JavaScript 콘솔의 차이점), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/8x9/items/8e728e955aaad1d526ae텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)