자바스크립트의 모든 값은 타입이 있다.
그중 개발자가 의도적으로 타입을 변환하는걸 명시적 타입 변환, 타입 캐스팅이라 한다.
let x = '15'
let num = Number(x)
let str = String(num)
console.log(typeof num) //number
console.log(typeof str) //string
반대로 자바스크립트 엔진에 의해 암묵적으로 타입이 변환되는건 암묵적 타입 변환, 타입 강제 변환이라 한다.
let x = 5
let y = '5'
console.log(x + y) // 55 string타입
console.log(tyopeof x) // number 타입 변환이 일어났어도 변수 자체는 변하지 않는다.
0 + '' // "0"
NaN + '' // "NaN"
Infinity + '' // "Infinity"
true + '' // "true"
null + '' // "null"
undefined + '' // "undefined"
({}) + '' // "[object Object]"
[] + '' // ""
문자열 타입으로만 타입 변환하는건 아니다
'5' > 0 // true
+'' // 0
+'hi' // NaN
+true // 1
+null // 0
+[] // 0
+[1,2] // NaN
비교 연산자의 경우는 코드 문맥상 모두 숫자 타입이어야 해서 숫자 타입으로 변환한다.
Truthy, Falsy(참으로 평가되는 값, 거짓으로 평가되는 값)???
조건식같이 불리언 값으로 평가되어야하는 문맥에선 Truthy, Falsy한 값으로 타입변환된다.Falsy
false
undefined
null
0
NaN
''
그외의 모든 값은 Truthy한 값을 가진다.
표준 빌트인 생성자 함수를 new 연산자 없이 호출, 빌트인 메서드 사용, 암묵적 타입 변환을 이용하는 방법이 있다.
String(NaN) // "NaN"
(NaN).toString() // "NaN"
NaN + "" // "NaN"
Number('1') // 1
parseInt('1') // 1
+'1' // 1
+true // 1
'1' * 1 // 1
Boolean('') // false
Boolean('false') // true 이 결과는 위의 Falsy와 연관되어 있다.
!!'' // false
!!'false' // true
논리 연산자를 이용하여 타입 변환없이 평가한다. 평가 도중에 평가 결과가 확정된 경우 나머지 평가를 생략한다.
'x' || 'y' // 'x'
false || 'y' // 'y'
'x' || false // 'x'
'x' && 'y' // 'x'
false && 'x' // false
단축 평가를 이용하면 if문을 대체 할 수 있다. 실제로 사용할 것이 아니어도 이런게 있다는것을 이해하면 코드를 이해하기 편하다.
let a = ''
a = true && 'success'
let b = ''
b = false || 'fail'
console.log(a, b) // 'success' 'fail'
객체의 타입 에러를 확인하는 방법으로 쓸 수 있다
let x = undefined
let y = x && x.value // undefined
function stringLength(str){ // 문자열의 길이를 number타입으로 리턴해줌
str = str || '' // 매개변수 str의 값이 undefined일때 오류를 방지해준다.
return str.length
}
// 좀 더 깔끔하게
function stringLength(str = ''){ //이건 str의 기본값을 지정해주는 방식
return str.length
}