자바스크립트에서 변수는 타입을 가지고 있고 다른 타입으로 변환할 수 있다.
개발자의 의도대로 타입을 변경하는 명시적 타입변환과 자스엔진이 변경하는 암묵적 타입 변환이 있다.
var x=10
var str1=x.toString(); //명시적 타입변환
이 때, 타입변환은 x 변수의 값을 변경시키는 것이 아니다. 타입 변환해 새로운 값을 만들어 한 번 쓰고 버린다.
String(1);
(1).toString()
1+''
Number('1');
parseInt('1')
+'1'
'-1'*1 //-1
Boolean('x')//true
Boolean('')//false
!!'';//false
!!'true'//true
자스엔진이 암묵적으로 타입을 변환시키는 것인데 이게 참 헷갈리는 부분 잘 공부해두자.
var x=10
var str2=x+'';//
console.log(typeof str2);//string
'10'+2 //102
5*'10'//50
!0 //true
if(1){ }
//이게 무슨일이야
자바스크립트는 너무 유연한 나머지 위와 같은 코드도 최대한 에러를 내지않고 암묵적으로 타입을 변환시켜준다. 타입의 암묵적 변환이 어떻게 일어나는지 더 자세히 살펴보자.
1+'2'// 12
위 예제에서의 +는 피연산자 중 하나 이상이 문자열이므로 문자열 연결 연산자로 동작하기 때문에 숫자를 문자열 타입으로 변환시킨다.
0+''//0
-0+''//0
1+''//1
-1+''//-1
(Symbol())+''//typeError
//객체 타입들
({})+'' // "[object Object]"
Math+''//"[object Math]"
[]+'' //""
[10,20] + '' //"10,20"
Array+''//"function Array(){[native code]}"
+ 는 문자열을 합치는 연산자로 쓰이지만 -, *, / 는 산술연산자이기 때문에 웬만하면 숫자로 변환시켜준다. 만약 변환할 수 없는 때가 오면 NaN(숫자타입)을 반환함.
>, < 과 같은 비교연산자도 마찬가지이다.
1-'1'//0
1*'10'//10
1/'one'//NaN
'1'>0//true
if('') console.log(1);
if(true) console.log(2);
if(0) console.log(3);
if('str') console.log(4);
if(null) console.log(5);
//2 4
위에서 봤듯 0, null은 false 값이다.
근데 문자열은 true 값이 나오네..
'CAT' && 'DOG' // -> 'DOG'
// && 는 논리곱으로 둘 모두 true 여야 한다. 앞만 true 라고 해서 true 가 아니란 것,,!
'CAT' || 'DOG' // -> 'CAT'
// 둘 중 하나만이어도 ㄱㅊ 'CAT'
false && 'DOG' // -> false
// 논리곱은 둘 중 1만 false 여도 false
false || 'DOG' // -> 'DOG'
//논리합은 하나만 true 여도 ㅇㅋ
var elem=null;
var value= elem.value; //TypeError
var elem=null;
//elem이 null or undefined 와 같은 값이면 elem으로 평가되고,
//elem이 true 면 elem.value 로 평가된다.
var value=elem && elem.value // null
에러가 안난다.. 왜지??? 단축평가는 무조건 값이 나와서?
?.는 좌항의 피연산자가 null 또는 undefined 면 Undefined 를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어간다.
var elem=null;
var value=elem?.value; //좌항이 null 임.
console.log(value); //undefined
옵셔널 체이닝은 변수가 Null 또는 undefined 가 아닌지 확인하고 프로퍼티를 참조할 때 유용함.
또 다른 예시
var str=""
var length=str?.length;
console.log(length)//0
좌항이 null, undefined 가 아니라 우항을 그대로 참조함.
?? 는 좌항이 null or undefined 면 우항을 반환하고 그렇지 않으면 좌항을 반환한다. 변수에 기본값을 설정할 때 유용하다. 옵셔널과 반대네
var foo=null ?? 'default string';
console.log(foo);//"default string"
var foo='' ?? 'default string';
console.log(foo);//""