javascript - queryselector란



왜{{}== null`이 SyntaxError를 주나요? (1)

{}을 true 또는 false 또는 자체와 비교할 수 있지만 null 또는 undefined와 비교하면 구문 오류가 발생합니다. 이것은 {}가 참조가 아닌 객체 값이기 때문에입니까? 어떤 종류의 런타임 유형 오류 대신 구문 오류가 발생하거나 그냥 작동한다고 이상하게 느껴집니다.

명확히하기 위해, 왜 이것이 SyntaxError인지, 궁극적으로 {} == {} 를 수행하는 것과 비교해 보면 궁금합니다.이 것은 SyntaxError가 아니고 오류도 아닙니다.


코드를 파싱 할 때 표현 컨텍스트와 문맥 컨텍스트라는 두 가지 주요 컨텍스트가 있습니다. 예를 들어 함수의 본문은 명령문 컨텍스트이고 할당의 오른쪽은 표현식 컨텍스트입니다. 두 가지를 구별하는 것은 다음과 같은 것을 금지하는 의미가 있습니다.

 if( if(true) ) alert("nonsense");

이제 REPL은 정말 어려운 작업을합니다. 한편으로는 함수와 코드 블럭을 구문 분석해야하고, 다른 한편으로는 특정 객체의 모양을 확인하기를 원합니다. 그러므로 이것 :

 { a: 1, b: 2 }

는 문맥 컨텍스트 내에서 { 코드 블록을 시작하고 : 는 유효하지 않으므로 실제로 JavaScript의 SyntaxError입니다. 그러나 REPL은 충분히 똑똑하고 그 객체를 표현 문맥에 넣고 그것을 괄호 안에있는 것처럼 평가합니다 :

({ a: 1, b: 2 })

같은 일이 발생합니다 :

 {} == {}

실제로 SyntaxError이기도하지만 REPL은이를 표현식 컨텍스트로 이동시킵니다.

 ({} == {})

"표현 컨텍스트로 이동하는"것은 복잡한 작업이며 마치 REPL이 여기에 표현식을 보지 못하는 것처럼 보입니다.

 {} == null

따라서 {} 을 블록으로 분석합니다. REPL은 첫 번째 문자와 마지막 문자가 {} == {} 하지만, {} == {} 에서는 {} == {} {} == null 아니라는 것을 순진하게 확인하기 때문에이 경우가 발생합니다.

크롬 소스 코드 의 관련 부분 :

 if (/^\s*\{/.test(text) && /\}\s*$/.test(text))
  text = '(' + text + ')';

executionContext.evaluate(text, "console", !!useCommandLineAPI, false, false, true, printResult);




google-chrome