7.3.1 동등비교(==)는 결과를 예측하기 힘들다.

 

안티패턴(가독성, 성능, 유지보수 등에 부정적인 영향을 줄 수 있어 지양하는 패턴) 예제.

'0' == ''; //false
0 == ''; //true
0 == '0'; //true
false == 'fasle'; //false;
false == '0' //true
false == null //false
false == undefined //false

 

7.3.1 일치비교(===) 연산자는 좌항과 우항의 피연산자가 타입도 같고 값도 같은 경우에 한하여 true를 반환.

 

 주의사항으로는 NaN이 있다. NaN은 자기 자신과 일치하지 않는 유일한 값이다.

따라서 숫자가 NaN인지를 판별하려면 Number.isNaN 함수를 사용한다.

NaN === NaN; //false

Number.isNaN(NaN); // true
Number.isNaN(10); // false
Number.isNaN(1 + undefined); //true

 

7.4 삼항 조건 연산자

조건식? 조건식이 true 일 때 반환할 값 : 조건식이 false 일 때 반환할 값

var result = score >= 60 ? 'pass' : 'fail';

Tip) if...else 문과 형식이 유사하나 삼항 조건 연산자 표현식은 값처럼 사용할 수 있어 장점을 갖는다.

if..else문은 표현식이 아닌 문이다. 따라서 if..else 문은 값처럼 사용할 수 없다.

삼항 조건 연산자 표현식은 값으로 평가할 수 있는 표현식인 문이다. 따라서 삼항 조건 연산자 표현식은 값처럼 다른 표현식의 일부가 될 수 있어 유용하다. 하지만 조건에 따라 수행해야할 문이 하나라가 아니라 여러 개라면 if..else 문의 가독성이 더 좋다.

 

7.5 논리연산자

 논리부정(!)연산자는 언제나 불리언 값을 반환한다. 만약 피연산자가 불리언값이 아니면 불리언타입으로 암묵적 타입 변환 된다.

 

 

7.8 typeof 연산자

 typeof 연산자로 null 값 조회시 null이 아닌 object 로 조회된다는 점을 주의해야한다. 자바스크립트 첫번째 버전에 버그. 따라서 값이 null 타입인지 확인할 때는 일치연산자(===)를 사용한다.

 

7.9 지수연산자(**)

 지수연산자는 ES7에서 도입. 좌항의 피연산자를 밑으로 우항의 피연산자를 지수로 거듭제곱하여 숫자값을 반환한다.

지수연산자가 도입되기 이전에는 Math.pow 메서드를 사용했다.

2 ** 2; // 4
2 ** 2.5; // 5.65685424949238
2 ** 0; // 1
2 ** -2; // 0.25

Math.pow(2,2) // 4
Math.pow(2 ** 2.5) // 5.65685424949238
Math.pow(2 ** 0) // 1
Math.pow(2 ** -2) // 0.25

//다음과 같은 경우 Math.pow보다 가독성이 좋다
Math.pow(2, Math.pow(3, 2));
2 ** (3 ** 2);

//음수의 거듭제곱을 계산하려면 다음과 같아야한다.
(-5) ** 2; // -25

//지수연산자는 이항연산자 중에서 우선순위가 가장 높다.
2 * 5 ** 2; // 50

 

7.11 연산자의 부수효과

 대부분의 연산자는 다른 코드에 영향을 주지 않는다. 다만 할당연산자(=), 증/감 연산자(++/--), delete 연산자는 부수효과가 있다.

 

8.2.1 if...else 문

 if 문의 조건문은 불리언 값으로 평가되어야한다. 만약 if문의 조건식이 불리언 값이 아닌 값으로 평가되면 자바스크립트 엔진에 의해 암묵적으로 불리언값으로 강제 변환되어 실행할 코드블록을 결정한다.

 

8.2.2 switch 문

switch(표현식) {
	case 표현식1:
     switch문의 표현식과 표현식1이 일치하면 실행될 문;
     break;
    case 표현식2:
     switch문의 표현식과 표현식2이 일치하면 실행될 문;
     break; 
    default:
     switch문의 표현식과 일치하는 case문이 없을 때 실행될 문;
}

 break 문이 없다면 폴스루(fall through)가 발생. -> break 처리를 잘해주어야함. default 부분은 switch 문의 맨마지막에 실행되므로 별도의 break가 필요없다. 

 break 문을 생략한 폴스루가 유용한 부분도 있다. 예제로 살펴보자

var year = 2020;
var month = 3;
var days = 0;

switch (month) {
	case 1: case 3: case 5: case 7: case 8: case 10: case 12:
     days = 31;
     break;
    case 4: case 6: case 9: case 11:
     days = 30;
     break;
    case 2:
     //윤년계산 알고리즘
     days = ((year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0))? 29: 28;
     break;
    default:
     console.log('invalid month');
}

console.log(days); //31

 

8.3.2 while문

  while문은 주어진 조건식의 평가 결과가 참이면 코드블록은 반복해서 실행한다. for문은 반복 횟수가 명확할 때 주로 사용하고 while문은 반복횟수가 불명확할 때 주로 사용된다. 주의할 점은 조건식의 평가가 언제나 참이면 무한루프가 된다.

 

9.1 타입변환이란?

 개발자가 의도적으로 값의 타입을 변환하는 것은 명시적 타입 변환 또는 타입 캐스팅이라고 한다.

반대로 개발자의 의도와 상관없이 자바스크립트 엔진에 의해 암묵적으로 타입이 변환되기도 한다.

이를 암묵적 타입 변환 또는 타입 강제 변환이라고 한다.

 

9.2.3 불리언 타입으로 변환

 자바스크립트 엔진은 불리언 타입이 아닌 값을 Truthy 값(참으로 평가되는 값) 또는 Falsy 값(거짓으로 평가되는 값)으로 구분한다. 즉, 제어문의 조건식과 같이 불리언 값으로 평가되어야 할 문맥에서 Truthy 값은 true로 Falsy 값은 false로 암묵적 타입 변환된다.

 

9.3.1 문자열 타입으로 변환

 - String 생성자 함수를 new 연산자 없이 호출 하는 방법

 - Object.prototype.toString 메서드를 활용하는 방법

 - 문자열 연결 연산자를 이용하는 방법

 

9.3.2 숫자 타입으로 변환

 - Number 생성자 함수를 new 연산자 없이 호출하는 방법

 - parseInt, parseFloat 함수를 사용하는 방법(문자열만 숫자타입으로 변환 가능)

 - +단항 산술 연산자를 이용하는 방법

 - * 산술 연산자를 이용하는 방법

 

9.3.3 불리언 타입으로 변환

 - Boolean 생성자 함수를 new 연산자 없이 호출하는 방법

 - ! 부정 논리 연산자를 두 번 사용하는 방법

 

 9.4 단축평가

 논리합(||), 논리곱(&&) 연산자 표현식은 언제나 2개의 피연산자 중 어느 한쪽으로 평가된다. 이처럼 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환한다. 이를 단축평가라고 한다. 단축 평가는 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가가정을 생략하는 것을 말한다.

 

단축평가를 사용하면 if문을 대신하는 것이 가능하다.

//논리곱(&&)
var done = true;
var message = '';

if (done) message = '완료';

//if문을 단축 평가로 대체
message = done && '완료'; // '완료' 할당
console.log(message); // 완료
//논리합(||)
var done = false;
var message = '';

if (!done) message = '미완료';

//if문을 단축 평가로 대체
message = done || '미완료'; // '미완료' 할당
console.log(message); // 미완료
//삼항조건연산자
var done = true;
var message = '';

if (done) {
	message = '완료';
} else {
	message = '미완료';
}

//if..else를 대체
message = done? '완료' : '미완료';
console.log(message); // 완료

'Study' 카테고리의 다른 글

모던자바스크립트 Deep Dive - 1일차  (0) 2022.03.30

4.1 변수는 왜 필요할까?

 먼저, 메모리에 대해서 알아야한다. 메모리는 메모리셀의 집합체이다. 메모리 셀 하나의 크기는 1byte로 8bit에 해당한다. 그래서 1바이트 단위로 데이터를 저장하거나 읽어 들이는 것이다.

 

그림1 메모리/ 출처: http://www.tcpschool.com/c/c_pointer_intro

 각 셀을 고유 주소를 가진다. 메모리 주소는 메모리 공간의 위치를 나타내며 , 0부터 시작하여 메모리 크기만큼 정수로 표현된다.

 메모리 주소에 직접적으로 접근하는 것은 치명적인 오류가 발생할 가능성이 크다. 왜냐하면 메모리주소는 코드가 실행될 때 메모리 상황에 따라 임의로 결정되기 때문이다. 또한 코드가 실행되기 전에는 값이 저장된 주소도 알 수 없다.

그래서 프로그래밍 언어는 기억하고 싶은 값을 기억하고, 저장된 값을 읽어 들여 재사용하기 위해 변수라는 매커니즘을 제공한다.

 변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다.

 

6. 자바스크립트는 7개의 데이터타입을 제공한다. 7개의 데이터 타입은 원시타입과 객체타입으로 분류가능하다.

 

원시타입

- number: 정수와 실수 구분없이 하나의 숫자타입만 존재

- string: 문자열

- boolean: 논리적 참(true), 거짓(false)

- undefined: var 키워드로 선언된 변수에 암묵적으로 할당되는 값

- null: 값이 없다는 것을 의도적으로 명시할 때 사용하는 값

- symbol: ES6에 추가된 7번째 타입

 

객체타입

- 객체, 함수, 배열 등..


6.1 number - 숫자 타입

 ECMAScript 사양에 따르면 숫자타입의 값은 배정밀도 64비트 부동소수점 형식을 따른다. 즉, 모든 수를 실수로 처리하며, 정수만 표현하기 위한 데이터 타입은 별도로 존재하지 않는다.

 

 

 

 

'Study' 카테고리의 다른 글

모던자바스크립트 Deep Dive - 2일차  (0) 2022.03.31

+ Recent posts