for (let i = 0; i < 10; i++) {} // for statment
while (true) {} // while statment
if (true) {} // if statment
let a; // declaration statment
function b() {} // function declaration statement
let a = 3 * 6; // 1.
let b = a; // 2.
b; // 3.
공식 문서중 일부
📑 출처
문의 완료 값을 확인하는 방법은 없을까?
let c = 10;
같은 문은 완료 값이 뭘까?
c = 10;
은 할당 이후의 값(여기서는 10)이 완료 값이지만, let
문 자체의 완료 값은 undefined
다.콘솔 창이 반환해준 완료 값은 개발자가 내부 프로그램에서 사용할 수 있는 값은 아니다. 그럼 완료 값을 사용할 방법은 없을까?
{ }
블록은 내부의 가장 마지막 문/표현식의 완료 값을 자신의 완료 값으로 반환한다.let b;
if (true) {
b = 5 + 10;
}
b = 5 + 10;
의 완료 값이 15이므로 if 블록의 완료 값도 15를 반환한 것이다.하지만 다음과 같은 코드가 작동하지 않는 건 분명히 문제가 있다.
let a, b;
a = if (true) {
b = 5 + 10;
}
eval()
함수를 사용할 수 밖에 없다.let a, b;
a = eval('if (true) { b = 5 + 10; }');
a; // 15
ES7 명세에는 'do 표현식'이 제안된 상태다.
let a, b;
a = do {
if (true) {
b = 5 + 15;
}
};
a; // 15
do { }
표현식은 (하나 이상의 문을 포함한) 블록 실행 후 블록 내 마지막 문의 완료 값을 do 표현식 전체의 완료 값으로 반환하며 결국 이 값이 변수 a 에 할당된다.do { }
표현식이 도입되어 eval()
같은 나쁜 것들을 사용하고픈 욕구를 영원히 잠재울 수 있길 고대한다.let a = 2;
let b = a + 3;
a + 3
자체는 가령 a 값을 바꾸는 등의 부수 효과가 전혀 없다.b = a + 3
문에서 결괏값 5가 b에 할당될 뿐이다.다음의 함수 호출 표현식은 부수 효과를 가진(가졌을지 모를) 표현식의 전형적인 예이다.
let a = 1;
function foo() {
a += 1;
}
foo(); // 결괏값: 'undefined', 부수 효과: 'a'가 변경됨.
다른 부수 효과를 지닌 표현식을 보자.
let a = 7;
let b = a++;
a; // 8
b; // 7
a++
이 하는 일은 두 가지다.
++a++
은 문법에 맞는 구문일까?
- 실행하면 ReferenceError 에러가 난다.
- 부수 효과를 유발하는 연산자는 부수 효과를 일으킬 변수 레퍼런스가 꼭 필요하기 때문이다.
++a++
에서는a++
시 ++ 연산자는 42 같은 원시 값에 직접 부수 효과를 일으킬 수는 없으므로 ReferenceError를 던진다.
delete
역시 부수 효과를 일으키는 연산자다.
delete
는 객체의 프로퍼티를 없애거나 배열에서 슬롯을 제거할 때 쓴다.const obj = {
a: 30,
};
obj.a; // 30
delete obj.a; // true
obj.a; // undefined
delete
연산자의 결괏값은 유효한/허용된 연산일 경우 true
, 그 외에는 false
다.delete
연산자는 true
를 반환한다. 그 외의 경우는 false
를 반환하거나 에러를 낸다.마지막으로 예시할 부수 효과 유발 연산자는 언뜻 보기에 분명한 것 같으면서도 분명하지 않은
=
할당 연산자다.
let a;
a = 42; // 42
a; // 42
a = 42
에서 =
연산자는 아무리 봐도 부수 효과와는 무관해 보인다.a = 42
문의 실행 결과는 이제 막 할당된 값(42)이므로 42를 a에 할당하는 자체가 본질적으로 부수 효과다.이렇게 할당 표현식문 실행 시 할당된 값이 완료 값이 되는 작동 원리는 다음과 같은 연쇄 할당문(Chained Assignment)에서 특히 유용하다.
let a, b, c;
a = b = c = 20;
c = 20
평가 결과는 (20을 c에 할당하는 부수 효과를 일으키며) 20이 되고, b = 20
평가 결과는 (20을 b에 할당하는 부수 효과를 일으키며) 20이 된다. 결국, a = 20
으로 (20을 a에 할당하는 부수 효과를 일으키며) 평가된다.또 다른 예를 보자.
function vowels(str) {
let matches;
if (str) {
// 모든 모음을 추출한다.
matches = str.match(/[aeiou]/g);
if (matches) {
return matches;
}
}
}
vowels("Hello World"); // ["e", "o", "o"]
if
문을 하나로 간단히 합칠 수 있다.function vowels(str) {
let matches;
// 모든 모음을 추출한다.
if (str && (matches = str.match(/[aeiou]/g))) {
return matches;
}
}
vowels("Hello World"); // ["e", "o", "o"]
matches = str.match
를 감싸는 ( )를 빠뜨리면 안 된다.
어렵네요