// 10 + 20은 평가되어 숫자 값 30을 생성한다.
10 + 20; // 30
// 숫자 리터럴 3
3
// 정규 표현식 리터럴
/[A-Z]+/g
var score = 100;
// 100은 리터럴이다.
// 리터럴 100은 js 엔진에 의해 평가되어 값을 생성하므로 리터럴은 그 자체로 표현식이다.
var score = 50 + 50;
// 50 + 50은 리터럴과 연산자로 이뤄져 있다.
// 50+50도 평가되어 숫자 값 100을 생성하므로 표현식이다.
score; // 100
// 변수 식별자를 참조하면 변수 값으로 평가됨.
// 식별자 참조는 값을 생성하지는 않지만 값으로 평가되므로 표현식임.
표현식은 리터럴, 식별자(변수, 함수 등의 이름), 연산자, 함수 호출 등의 조합으로 이뤄질 수 있다.
값으로 평가될 수 있는 문은 모두 표현식이다 !!
// 리터럴 표현식
10
'Hello'
// 식별자 표현식(선언이 이미 존재한다고 가정)
sum
person.name
arr[1]
// 연산자 표현식
10 + 20
sum = 10
sum !== 10
// 함수/메서드 호출 표현식(선언이 이미 존재한다고 가정)
square()
perosn.getName()
var x = 1 + 2;
// 식별자 표현식 x는 3으로 평가된다.
x + 3; // -> 6
// 문은 선언문, 할당문, 조건문, 반복문 등으로 구분할 수 있다.
// 변수 선언문
var x;
// 할당문
x = 5;
// 함수 선언문
function foo () {}
// 조건문
if (x > 1) { console.log(x); }
// 반복문
for (var i = 0; i < 2; i++) { console.log(i); }
function foo () {
return
{}
// ASI의 동작 결과 => return; {};
// 개발자의 예측 => return {} ;
}
console.log(foo()); // undefined
var bar = function () {}
(function() {})();
// ASI의 동작 결과 => var bar = function () {}(function() {})();
// 개발자의 예측 => var bar = function () {}; (function() {})();
// TypeError: (intermediate value)( ... ) is not a function
그러나 결론적으로는 세미콜론 사용을 권장한다.
// 변수 선언문은 평가될 수 없으므로 표현식이 아니다.
var x;
// 1, 2, 1+2, x = 1+2는 모두 표현식이다.
// x = 1 + 2는 표현식이면서 완전한 문이기도 하다.
x = 1 + 2;
표현식과 문을 구별하는 방법!
- 표현식인 문: 평가될 수 있는 문
- 표현식이 아닌 문: 값으로 평가될 수 없는 문.
ex) 변수 선언문은 값으로 평가될 수 없음. ==> 표현식이 아닌 문이다.
하지만 할당문은 값으로 평가될 수 있음 ==> 표현식인 문.
표현식인 문과 아닌 문을 구별하는 가장 간단하고 명료한 방법은 변수에 할당해 보는 것!// 표현식이 아닌 문은 값처럼 사용할 수 없다. var foo = var x; // SyntaxError: Unexpected token var // 변수 선언문은 표현식이 아닌 문이다. 값으로 평가될 수 없다. 따라서 변수 선언문은 값처럼 사용할 수 없음.
// 변수 선언문은 표현식이 아닌 문이다. var x; // 할당문은 그 자체가 표현식이지만 완전한 문이기도 하다. 즉, 할당문은 표현식인 문이다. x = 100;
// 표현식인 문은 값처럼 사용할 수 있다. var foo = x = 100; console.log(foo); // 100 // 할당문을 값처럼 변수에 할당함. 표현식인 문인 할당문은 할당한 값으로 평가된다. // x = 100은 x 변수에 할당한 값 100으로 평가된다. 따라서 foo 변수에는 100이 할당됨.
완료 값(completion value)
- 크롬 개발자 도구에서 표현식이 아닌 문을 실행하면 언제나 undefined를 출력하는데, 이를 완료 값이라고 한다.
- 완료 값은 표현식의 평가 결과가 아니다. 따라서 다른 값과 같이 변수에 할당할 수 없고 참조할 수도 없다.