자바스크립트는 느슨한 언어이자 동적 언어입니다.
그렇기에 실행되는 순간에 파악이 됩니다.(런타임)
값을 바꾸려면 재할당을 해야합니다.
원시값을 교체할 수 있지만, 직접적으로 변형이 불가합니다.
원시 값에 직접적으로 작업하지 않으면, 원본을 건드리지 않고 복사본을 가져와 작업합니다.
가변적인 예를 확인해 보겠습니다.
위 예제를 보면 마지막
arr[3] = 1000
을 할당하니 arr의 배열 값이 변하게 되었습니다.
이렇게 유동적으로 변하기 때문에 조심스럽게 사용해야합니다.
이 이미지 하나로 설명이 가능합니다.
undefined는 아무것도 정의되지 않았을 때, null은 임의로 지정한 빈 값입니다.
코드로 보게 되면
NaN 과 0이 나오게 됩니다.
여기서 NaN은 숫자로 변환 실패시 나오는 Not-A-Number(숫자가 아님)입니다.
위 예시 코드처럼 아예 아무것도 지정하지 않으면(undefined) 할당값이 아예 없는 것이고,
null로 지정한다면 빈 값이 할당되어 있기 때문에 숫자로 변환이 가능합니다.
const num = new Number(1)
false 로 나오는 이유는 1 과 Number의 주소가 서로 다르기 때문입니다.
ex 1
const result1 = 1 + '입니다.'; // 1입니다.
console.log(typeof result1); // string
숫자형 + 문자형 인데, typeof에서는 String이 나왔습니다.
그 이유는 뭘까요? 바로 문자열이 우선순위이기 때문에 숫자형도 문자형으로 변환 되었습니다.
또 다른 예제를 보겠습니다.
ex 2
const result2 = '11' + 11; //1111
console.log(typeof result2); // string
ex1
과 동일하게 string으로 변환 되었습니다.
ex 3
const result3 = '2' * '2'; // 4
console.log(typeof result3); // Number
문자형 + 문자형 인데 예상하기로는 22가 나와야하는데 4가 나왔습니다.
왜 그럴까요?
이유는 Number 형으로 암시적 형변환을 하였기 때문입니다.
이렇게 우리가 예측할 수 없는 방향으로 형변환을 하는게 바로 암시적 형변환인데요.
우리가 예측할 수 있게 명시적으로 지정하여 형변환을 하는 것이 좋습니다.
문법
Number(값)
String(값)
Array(값)
사용 예제
const num = 1;
const str = '1';
num1 = num + Number(str); // 2
Boolean(값);
으로 변환해서 사용해야하는 경우가 있습니다.변환 방법
Boolean(값); // true
논리라는 것은 사고적인 생각이나 과정에 따라 맞춰가는 이치를 찾는 것 입니다.
||
(또는)console.log(true || false) //true
console.log(true || true) //true
둘 중에 하나라도 true면 true를 출력합니다.
&&
(그리고)console.log(false && true) //false
console.log(false && false) //false
console.log(true && true) // true
둘 중에 하나라도 false면 false를 출력합니다.
!
(부정)console.log(!true) //false
console.log(!false) //true
기존에 있는 값을 뒤집습니다. (true ➡️ false)
논리 연산자 사용 : 19살 이상이며, 여성일 경우에만 '나는 성인입니다.'를 출력
const age = 20;
const isAdult = age > 19;
const gender = 'girl';
const isGirl = gender === 'girl';
if (isAdult && isGirl) {
console.log('나는 성인입니다.');
}
논리 연산자를 이용하여 if문의 식을 간단하게 작성할 수 있습니다.
===
을 쓰는 것을 추천합니다.==
은 느슨한 비교를 하고, ===
은 엄격한 비교를 하기 때문입니다.console.log('1' == 1); //true
console.log('1' === 1); //false
왜 결과 값이 다를까요?
그 이유는==
은 타입이 다르지만 숫자형을 문자형으로 암시적인 변환을 하였기 때문입니다.(위 타입변환에서 설명 했듯이 문자형이 우선 순위이기 때문에 숫자형이 문자형으로 변환 되었습니다.)
===
은 타입 변환을 하지않고, 엄격하게 타입까지 비교하기 때문에 false가 출력됩니다.
if(true)
if({})
if([])
if(42)
if("0")
if(new Date())
// 등
위에 기재 되어있는 값들은 Truthy 즉, true로 평가 되는 값 입니다.
각각 어떻게 출력되는지 확인해 보겠습니다.
예시 1
if(true) {
console.log('참입니다.'); //참입니다.
}
if({}) {
console.log('참입니다.'); //참입니다.
}
if([]) {
console.log('참입니다.'); //참입니다.
}
if(42) {
console.log('참입니다.'); //참입니다.
}
if("0") {
console.log('참입니다.'); //참입니다.
}
if(new Date()) {
console.log('참입니다.'); //참입니다.
}
참일때 if문이 실행되도록 작성하였습니다.
전부 '참입니다.'가 출력되었습니다. 즉, Truthy는 참일 경우에만 작동하는 값입니다.
예시 2
console.log([]&&'hello'); //hello
hello가 잘 작동 되는 모습입니다.
AND 연산자를 사용하여 둘 중에 하나라도 false면 작동할 수 없도록 작성하였습니다.
[]
는 참이고, 뒤에 있는 'hello'도 Boolean으로 변환 했을 때 참이기 때문에 작동할 수 있습니다.
if(false)
if(0)
if(-0)
if(0n)
if("")
if(null)
if(undefined)
if(NaN)
위에 기재 되어있는 값들은 Falsy 즉, false로 평가 되는 값 입니다.
각각 어떻게 출력되는지 확인해 보겠습니다.
if(false) {
console.log('거짓입니다.') //출력안됨
}
if(0) {
console.log('거짓입니다.') //출력안됨
}
if(-0) {
console.log('거짓입니다.') //출력안됨
}
if(0n) {
console.log('거짓입니다.') //출력안됨
}
if("") {
console.log('거짓입니다.') //출력안됨
}
if(null) {
console.log('거짓입니다.') //출력안됨
}
if(undefined) {
console.log('거짓입니다.') //출력안됨
}
if(NaN) {
console.log('거짓입니다.') //출력안됨
}
전부 출력되지 않습니다. 출력이 되도록 다시 작성해 보겠습니다.
if(false) {
console.log('참입니다.')
}else {
console.log('거짓입니다.') //거짓입니다.
}
if(0) {
console.log('참입니다.')
}else {
console.log('거짓입니다.') //거짓입니다.
}
if(-0) {
console.log('참입니다.')
}else {
console.log('거짓입니다.') //거짓입니다.
}
if(0n) {
console.log('참입니다.')
}else {
console.log('거짓입니다.') //거짓입니다.
}
if("") {
console.log('참입니다.')
}else {
console.log('거짓입니다.') //거짓입니다.
}
if(null) {
console.log('참입니다.')
}else {
console.log('거짓입니다.') //거짓입니다.
}
if(undefined) {
console.log('참입니다.')
}else {
console.log('거짓입니다.') //거짓입니다.
}
if(NaN) {
console.log('참입니다.')
}else {
console.log('거짓입니다.') //거짓입니다.
}
else
를 사용하여 참(true)이 아닐 경우 eles(다른 경우)를 통해 출력되도록 작성하였습니다.
참이 아니기 때문에 else에서 출력되는 모습을 확인할 수 있습니다.
이를 통해 Falsy임을 확인할 수 있습니다. Falsy를 사용할 때에는else
가 함께 사용됩니다.
Number.isNaN()
으로 검사해서 사용하는 습관을 기르면 좋습니다.명시적 변환 방법
Number(값)
Number(undefined); //NaN으로 출력(undefined는 숫자형으로 변경이 불가하기 때문)
parseInt('숫자로 변경 불가'); //NaN으로 출력(parseInt 정수로 변환해주는 메서드라 문자열을 숫자로 변경이 불가하기 때문)
Math.log(-1); //NaN으로 출력(Math.log는 음수이기 때문에 숫자로 표현될 수 없기 때문)
10 + NaN; //NaN으로 출력(숫자 + NaN = NaN)
'가나다라' / 10; //NaN으로 출력(문자열 + 숫자형은 더해지지만 +가 아닐 경우 NaN 문자열로 변환이 되지 않기 때문)
Math.pow(2, 1024); //Infinity
17 / 0; //Infinity
isFinite()
를 통해 체크가 가능합니다.isFinite(Infinity); //false
isFinite(NaN); //false
isFinite(20); //true
typeof
에서 bigint
로 나옵니다. (Namber가 아니지만 동등합니다. 엄격한 검사에서는 false)Bigint(값)
소수점을 다루는 방법
Math.floor(값) //가장 가까운 정수로 내립니다.
Math.ceil(값) //가장 가까운 정수로 올립니다.
Math.round(값) //가장 가까운 정수로 반올림 합니다.
정수로 변환하는 방법
parseInt(값, 진수);
+
-
*
/
%(나머지)
를 사용하여 연산합니다.1 + 1 // 2
1 - 1 // 0
10 / 5 // 2
13 % 2 // 1 (13과 2를 나누면 몫은 6이고 나머지는 1입니다.)
++
증감 연산자, 빼기 연산자를 두번 사용하면 --
감소 연산자 for문에서 많이 사용됩니다.x = x + 1;
x++; //2
x = x - 1;
x--; // 2
10 + (5 * 2)
느슨한 검사
isNaN(undefined); //true
isNaN({}); //true
isNaN('문자열'); //true
엄격한 검사
Number.isNaN(undefined); //flase
Number.isNaN({}); //flase
Number.isNaN('문자열'); //flase
같은 값을 넣었는데 왜 다르게 출력될까요?
isNaN
은 과거에 나온 메서드이고,Number.isNaN
은 최근에 나온 메서드입니다.
엄격한 검사를 위해Number.isNaN
을 사용하시는 것을 권장합니다.
const sigleQuote = '';
const doubleQuote = "";
const backQuote = ``;
const test = `hello
JS!`;
console.log(test);
// 출력
// hello
// JS!
const num = 1;
const str = "sunny";
console.log(`hi, ${str}`! ${num})
//출력
//hi, sunny! 1
String({}); // 'Object Object'
String(값);
+
)를 문자열도 더하기가 가능합니다.function genHello(name) {
return '안녕하세요' + (name ? name : '이름없음' + `님 반갑습니다.`)
}
genHello(); // 안녕하세요 이름없음님 반갑습니다.
.split
이라는 메서드를 사용하면 문자열을 쉽게 배열할 수 있습니다.'HELLO'.split(''); // (5) ['H', 'E', 'L', 'L', 'O']
'HELLO, WORLD!'.split(','); //(2) ['HELLO', ' WORLD!']
const test = 'hello world';
[...test] // (11) ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
=
: 오른쪽 피연산자의 값을 왼쪽 피연산자에 저장합니다.+=
: 오른쪽 피연산자의 값을 왼쪽 피연산자와 더해서 왼쪽 피연산자에 저장합니다.-=
: 오른쪽 피연산자의 값을 왼쪽 피연산자에서 빼서 왼쪽 피연산자에 저장합니다.*=
: 오른쪽 피연산자의 값을 왼쪽 피연산자와 곱해서 왼쪽 피연산자에 저장합니다./=
: 왼쪽 피연산자를 오른쪽 피연산자로 나눠서 왼쪽 피연산자에 저장합니다.%=
: 왼쪽 피연산자에서 오른쪽 피연산자로 나눈 나머지(모듈러스)를 왼쪽 피연산자에 저장합니다.<<=
: 오른쪽 피연산자 값의 비트수만큼 왼쪽 피연산자를 왼쪽으로 이동해서 왼쪽 피연산자에 저장합니다.>>=
: 오른쪽 피연산자 값의 비트수만큼 왼쪽 피연산자를 오른쪽으로 이동해서 왼쪽 피연산자에 저장합니다.&=
: 왼쪽, 오른쪽 피연산자의 비트 AND를 구해서 왼쪽 피연산자에 저장합니다.|=
: 왼쪽, 오른쪽 피연산자의 비트 OR를 구해서 왼쪽 피연산자에 저장합니다.^=
: 왼쪽, 오른쪽 피연산자의 비트 XOR를 구해서 왼쪽 피연산자에 저장합니다.삼항 연산자
const val = (조건) ? 참일때 : 거짓일때 ;
if문
if (조건) {
return 참일때;
} else {
return 거짓일때;
}
if (대상 비교연산자 비교할 값)
//예시
const age = 6;
if (age < 10) {
console.log('어린이 입니다.');
}
typeof 'string'; //string
typeof 123; //number
typeof 1n; //bigint
typeof true; //boolean
typeof symbol(); //symbol
typeof undefined; //undefined
typeof []; //object
typeof {}; //object
typeof null; //object
typeof new Boolean(true); //object
const obj ={};
obj instanceof Object; //true
obj instanceof Array; //false
obj는 객체이기 때문에 Object가 맞습니다.(true)
obj는 배열이 아니기 때문에 false입니다.