JavaScript의 구문이 너무 불쌍한 것은 모든 사람에게 잘 알려져 있습니다.
먼저 사진을 올리자
코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
{} + []; // 0
[] + {}; // "[Object Object]"
{} + [] == [] + {}; // 거짓
({} + [] == [] + {}); // 진실
이러한 고통스러운 구문 함정은 아마도 자바 스크립트와 같은 이상한 것일 것입니다.
자바 스크립트 컴파일러를 공부하지 않는 대부분의 어린이 신발은 전혀 이해할 수 없다고 생각합니다. (적어도 나는 그것을 믿어지지 않는다)
나중에, 나는 바이두 소녀에게 잠시 동안 갔다가 갑자기 그것을 깨달았습니다!
이 코드를 살펴 보겠습니다.
코드 사본은 다음과 같습니다.
{
A : 1
}
나는 대부분의 어린이 신발이 이것이 첫눈에 물체를 직접 측정 한 것이라고 생각할 것입니다.
이 코드는 어떻습니까?
코드 사본은 다음과 같습니다.
{
var a = 1;
}
브라우저에 구문 오류가 프롬프트됩니까?
분명히! 당신이 그것에 대해 신중하게 생각한다면, 우리는 이것이 진술 블록이라는 것을 이해할 것입니다.
코드 사본은 다음과 같습니다.
if (iSnumber) {
var a = 1;
}
이것에 대해 말하면, 당신은 {.
그렇다면 JavaScript 컴파일러는이 모호성을 어떻게 처리합니까?
이 문제를 해결하기 위해 ECMA의 방법은 매우 간단하고 조잡합니다. 구문을 구문 분석 할 때 문이 "{"로 시작하면 문장 블록으로만 해석됩니다.
이것은 정말 부정 행위입니다!
그것들은 모두 명령문 블록이기 때문에 왜 {a : 1}가 구문 오류가없는 이유는 무엇입니까?
실제로, 여기서 A는 파서에 의해 태그로 이해됩니다. 태그는 브레이크와 방향 점프에 대한 문장을 계속하는 데 사용됩니다.
따라서 이러한 작문 방법은 예외를 던질 것입니다.
코드 사본은 다음과 같습니다.
{
A : function () {}
}
function () {}는 함수 선언이 아니기 때문에 함수 표현식도 아니기 때문입니다.
이 시점에서 모든 사람은 {}의 이상한 처리에 대한 기본 개념을 가져야합니다. 기사의 시작 부분에서 언급 된 몇 가지 문장을 다시 살펴 보겠습니다.
코드 사본은 다음과 같습니다.
{} + []; // 0
[] + {}; // "[Object Object]"
{} + [] == [] + {}; // 거짓
({} + [] == [] + {}); // 진실
첫 번째는 {}가 문 블록이기 때문에 코드는 다음과 같이 이해할 수 있습니다.
코드 사본은 다음과 같습니다.
if (1) {}
+[]
따라서 반환 값은 0입니다.
둘째, {}는 문의 시작 부분에 있지 않기 때문에 일반 객체 직접 수량이며 빈 배열 및 빈 객체가 직접 추가되고 "[개체 개체]"가 반환됩니다.
첫 번째와 두 번째 기사를 이해하지만 세 번째 기사를 설명 할 필요는 없습니다.
제 4 조는 ()로 시작하기 때문에 첫 번째 {}는 객체의 직접 수량에 구문 분석되므로 두 공식은 동일하고 True를 반환합니다.