
개발자가 의도적으로 값의 타입을 변환하는 것을
명시적 타입 변환또는타입 캐스팅이라 한다.자바스크립트 엔진에 암묵적으로 타입이 변환 되는 것을
암묵적 타입 변환또는타입 강제 변환이라 한다.
속도 측정
function test() {
for (var i = 0; i < 100000000; i++) {
// 1. 암묵적 타입 변환
// let a = i + '';
// 2. 명시적 타입 변환
// let a = i.toString();
};
}
var start = performance.now();
test();
var end = performance.now();
console.log((end-start) + 'ms');
결과
| 암묵적 타입 변환 | 명시적 타입 변환 | |
|---|---|---|
| vscode | 4392.094399988651ms | 4572.901900053024ms |
| chrome | 2820.399999976158ms | 3028.600000023842ms |
암묵적 타입 변환과 명시적 타입 변환의 성능 차이는 언어나 컴파일러에 따라 다를 수 있지만,
일반적으로 암묵적 타입 변환은 명시적 타입 변환보다 빠를 수 있다.
이는 컴파일러나 인터프리터가 암묵적 타입 변환을 최적화할 수 있기 때문이다.
물론 성능 차이가 크게 없다.
코드의 가독성과 유지보수성을 고려하여 어떤 방법을 선택할지를 결정하는 것이 중요할 것 같다!
암묵적 타입 변환 : 자바스크립트 엔진이 표현식을 평가할 때 코드의 문맥을 보고 원시 타입 중 하나로 암묵적으로 타입을 강제 변환시켜준다.
// + 연산자
1 + '2' // '12'
자바스크립트 엔진은 문자열 연결 연산자 표현식을 평가하기 위해 문자열 연결 연산자의 피연산자 중에서 문자열 타입이 아닌 피연산자를 문자열 타입으로 암묵적 타입 변환한다.
// 산술 연산자
1 - '1' // '0'
// 비교 연산자
'1' > 0 // true
자바스크립트 엔진은 산술, 비교 연산자 표현식을 평가하기 위해 산술, 비교 연산자의 피연산자 중에서 숫자 타입이 아닌 피연산자를 숫자 타입으로 암묵적 타입 변환한다.
자바스크립트 엔진은 불리언 타입이 아닌 값을 Truthy 값 또는 Falsy 값으로 구분한다.
명시적 타입 변환 : 개발자의 의도에 따라 명시적으로 타입을 변경하는 방법!
// 1. String 생성자를 함수를 new 연산자 없이 호출하는 방법
String(1); // '1'
// 2. Object.prototype.toString 메서드를 사용하는 방법
(1).toString(); // '1'
// 3. 문자열 연결 연산자를 이용하는 방법
1 + ''; // '1'
// 1. Number 생성자 함수를 new 연산자 없이 호출하는 방법
Number('1'); // 1
// 2. parseInt, parseFloat 함수를 사용하는 방법(문자열만 숫자 타입으로 변환 가능)
parseInt('1'); // 1
// 3. + 단항 산술 연산자를 이용하는 방법
+ '1'; // 1
// 4. * 산술 연산자를 이용하는 방법
'1'* 1; // 1
// 1. Boolean 생성자 함수를 new 연산자 없이 호출하는 방법
Boolean('x'); // true
// 2. ! 부정 논리 연산자를 두 번 사용하는 방법
!!'x'; // true
단축 평가 : 논리 연산을 수행할 때 어느 한 쪽에서 이미 논리 연산의 결과가 확정되었다면 다음 연산을 이어가지 않고 즉시 평가를 완료하는 것
논리곱(&&) 연산자 : 두 개의 피연산자가 모두 true로 평가될 때 true를 반환한다.
'Cat' && 'Dog' // "Dog"
논리합(||) 연산자 : 두 개의 피연산자중 하나만 true로 평가되어도 true를 반환한다.
'Cat' && 'Dog' // "Cat"
유용하게 사용할때!
// 1. 객체를 가리키기를 기대하는 변수가 null 또는 undefined가 아닌지 확인하고 프로퍼티를 참조할때
var elem = null;
var value1 = elem.value; // typeError
var value2 = elem && elem.value; // null
// 2. 함수 매개변수에 기본값을 설정할 때
let elem;
let a = elem || ''; // ''
let b = elem; // undefined
옵셔널 체이닝 연산자는 참조나 기능이 undefined 또는 null 일 수 있을 때 연결된 객체의 값에 접근하는 단순화할 수 있는 방법을 제공한다.
let customer = {
name: "Carl",
details: {
age: 82,
location: "Paradise Falls",
},
};
let customerCity1 = customer?.details // { age: 82, location: 'Paradise Falls' }
let customerCity2 = customer.details.getTime?.(); // undefined 함수도 call 가능
null 병합 연산자 : 왼쪽 피연산자가 null 또는 undefined일 때 오른쪽 피연산자를 반환하고, 그렇지 않으면 왼쪽 피연산자를 반환하는 논리 연산자이다.
// undefinded, null 아니면 그대로 반환한다.
var str1 = null ?? 'test'; //test
var str2 = false?? 'test'; //false