
이번주 5장이라고 질질 끌다가 마감날이 되서야 완료했다ㅠㅠ 한번 읽기 시작하면 책은 재밌는데.. 읽으려고 마음먹기 쉽지 않네. 또 정리를 너무 많이 하려고 하다보니 부담감을 느끼는거 같다. 처음 목표대로 완독의 목적을 두자. 다음주는 미루지 말쟈..
블록문은 0개 이상의 문을 중괄호로 묶은 것으로, 코드 블록 또는 블록이라고 부르기도 한다. 자바스크립트는 블록문을 하나의 실행 단위로 취급한다.
문의 끝에 세미클론을 붙이는 것이 일반적이나, 블록문은 언제나 문의 종료를 의미하는 자체 종결성을 갖기 때문에 블록문의 끝에는 세미콜론을 붙이지 않는다.
조건문은 주어진 조건식의 평가 결과에 따라 코드 블록의 실행을 결정한다.
폴스루(fall through) : switch문을 탈출하지 않고 문이 끝날때까지 이후의 모든 case문과 default문을 실행하는 것
이러한 결과가 나오지 않으려면 case문에 해당하는 문의 마지막에 break문을 사용해줘야한다. default문에는 일반적으로 break문을 생략한다.
for문은 반복횟수가 명확할때 주로 사용하고 while문은 반복 횟수가 불명확할 때 주로 사용한다. while문은 조건문의 평가 결과가 거짓이 되면 코드블록을 실행하지 않고 종료한다.
break문은 레이블 문, 반복문, switch문의 코드블록을 탈출한다. 이외의 문에서 break문을 사용하면 syntax error가 발생한다.
레이블문은 식별자가 붙은 문을 말한다
foo: console.log("hello");
레이블문은 프로그램의 실행 순서를 제어하는데 사용한다. switch문의 case문과 default문도 레이블 문이다.
foo: {
console.log(1);
break foo; // foo 레이블 블록문 탈출
console.log(2);
}
중첩된 for문의 내부 for문에서 break문을 실행하면 내부for문을 탈출해서 외부 for문으로 진입한다.
만약 내부 for문이 아닌 외부 for문을 탈출 하려면 레이블 문을 사용한다.
outer: for (let i = 1 ; i <3 ; i++;) {
for(let j = 1 ; j < 3 ; j++;) {
if( i+j === 3 ) break outer;
console.log('진행중')
}
}
레이블 문은 중첩된 for문 외부로 탈출할때 유용하지만 그 밖의 경우에는 일반적으로 권장하지 않는다. 프로그램 흐름이 복잡해져서 가독성이 나빠지고 오류를 발생 시킬 가능성이 높아지기 때문이다.
개발자의 의도에 따라 다른 타입으로 변환할 수 있다. 개발자가 의도적으로 값의 타입을 변환하는 것을 명시적 타입변환 또는 타입 캐스팅 이라 한다.
개발자의 의도와는 상관 없이 표현식을 평가하는 도중에 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환되는 것을 암묵적 타입변환 또는 타입 강제 변환 이라 한다.
명시적 타입 변환이나 암묵적 타입 변환이 기존 원시 값을 직접 변경하는 것은 아니다. 원시 값은 변경 불가능한 값으로 변경할 수 없다.
명시적 타입 변환 보다 암묵적 타입 변환이 가독성 측면에서 더 좋을 수 도 있다.
문자열 타입으로 변환
+ 연산자는 피연산자 중 하나 이상이 문자열이므로 문자열 연결 연산자로 동작한다. 모든 피연산자는 코드 문맥상 모두 문자열 타입이어야 한다.
숫자 타입으로 변환
산술 연산자의 역할은 숫자 값을 만드는 것이다. 코드 문맥상 피연산자는 모두 숫자 타입이어야 한다. 피연산자를 숫자 타입으로 변환할 수 없는 경우에는 NaN가 나온다.
옵셔널 체이닝 연산자
연산자?. 좌항의 피연산자가 null 또는 undefined 인 경우 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어간다
null 병합 연산자
연산자 ??는 좌항의 피연산자가 null 또는 undefined 인 경우 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환한다. 변수에 기본값을 설정할때 유용하다.
원시 값은 변경 불가능한 값이다.
불변성을 갖는 원시 값을 할당한 변수는 재할당 이외에 변수 값을 변경할 수 있는 방법이 없다. 이는 데이터의 신뢰성을 보장한다.
객체는 변경 가능한 값이다. 객체를 할당한 변수에는 참조 값이 들어 있다. 참조 값은 생성된 객체가 저장된 메모리 공간의 주소 그 자체 이다. 재할당 없이도 객체를 직접 변경할 수 있다. 이렇게 된 이유에는 객체를 생성하고 관리하는 방식은 매우 복잡 하고 비용이 많이 드는 방식이기 때문에 메모리의 효율적 소비가 어렵고 성능이 나쁘다. 따라서 메모리 효율적으로 사용하기 위해 변경 가능한 값으로 설계 되어졌다.
이러한 이유때문에 여러개의 식별자가 하나의 객체를 공유할 수 있다. 이를 참조에 의한 전달이라 한다. 어느 한 쪽에서 객체를 변경하면 서로 영향을 주고 받는 문제가 생긴다.
자바스크립트 엔진은 피연산자를 숫자 타입으로 변환할 수 없는 경우 산술 연산을 수행할 수 없어 표현식의 결과는 NaN이 됩니다. 다음 중 연산 결과가 (숫자 타입) 2가 되는 경우를 모두 고르세요.
var num = 2;
num + 'string' // 2string
num + undefined // NaN
num + '' // '2'
num + null // 2
num + [] // '2'
num + {} // '2[object Object]'
num + [10, 11] // 210, 11
num + false // 2
num + function(){} // '2function(){}'
num + '0' // 20
문제를 풀었을때 답이 num + [] 과 num + false 이라고 생각했는데..
아직도 헷갈리는 형변환을 알아보쟈..
자바스크립트에서 각 연산자는 원시값을 피 연산자로 가지고 있어야된다.
즉, 참조값은 연산에 사용이 불가하다
하지만, 위에 문제를 보면 num + [] // '2' 로 나온다.
왜냐하면, 참조값이 자바스크립트 엔진에 의해 자동으로 원시값으로 형변환 되었기 때문이다.
array 는 toString() 이라는 함수를 가지는데 연산에 사용되었을때 내부적으로 toString() 이 호출되어 string으로 바꾸고 연산이 된다.
num + [] => num + [].toString() => num + '' => "2"
위와 같은 연산 과정을 거치게 되는 것이다.
객체 역시 연산 과정에서 자동으로 원시값으로 형 변환 된다.
객체에도 toString() 함수가 작동하고 ''[object Object]'' 값으로 변환된다.
null + 숫자 연산은 NaN 라고 생각하고 있었는데.. null은 숫자와 연산할때 0으로 변환된다.