값으로 평가될 수 있는 문(statement)
표현식이 평가되면 새로운 값을 생성하거나 기존 값을 참조한다.
var score = 100; //리터럴 100이 평가되어 100이라는 값을 생성
// -> 이 자체(리터럴 100)로 표현식임
var score = 50+50; //50+50이 평가되어 100이라는 값을 생성 -> 50+50이 표현식
score; //값을 생성하지는 않지만 값으로 평가되므로 표현식
즉, 값으로 평가될 수 있는 문은 모두 표현식이다.
표현식과 표현식이 평가된 값은 동등한 관계(동치)이므로 표현식은 값처럼 사용 가능하다. → 즉 문법적으로 값이 위치할 수 있는 자리에서는 표현식도 위치할 수 있다.
1 + 2 + 3; //6
var x = 1 + 2;
x + 3; //6
위 예시에서 x는 3으로 평가되고 있으므로, 똑같이 3으로 평가되는 1+2가 위치한 자리에 표현식 x도 위치할 수 있다.
x+3이 6으로 평가되고 있는 것처럼, 표현식은 다른 표현식의 일부로 들어가 새로운 값을 만들어낼 수 있다.
var x; //변수 선언문은 값을 평가될 수 없으므로(undefined) 표현식이 아니다.
x = 1 + 2; //표현식이면서 완전한 문
표현식인 문: 값으로 평가될 수 있는 문(ex. 선언문)
표현식이 아닌 문: 값으로 평가될 수 없는 문(ex. 할당문)
표현식인 문과 표현식이 아닌 문을 구별하는 가장 간단하고 명료한 방법은 변수에 할당해 보는 것이다. → 표현식이라면 값으로 평가되기 때문에 변수에 할당이 될 것이므로!!
var foo = var x; //선언문은 표현식이 아니므로 변수 할당 불가
var x;
x = 100; //리터럴 100은 그 자체로 표현식으므로 변수 할당 가능
var foo = x = 100; //할당문은 표현식으므로 변수에 할당 가능
💡 **크롬 개발자 도구에서 표현식이 아닌 문을 실행하면 언제나 undefined를 출력한다**
표현식이 아닌 문을 실행 = 완료 값
완료 값은 표현식의 평가 결과가 아니기 때문에 변수에 할당할 수도, 참조할 수도 없다 → undefined를 출력한다.
반대로 표현식인 문을 실행하면 평가된 값을 반환한다.