JS 기초(1)에 이어서.
+-*/% alert( 5 % 2 ); // 5를 2로 나눈 후의 나머지인 1을 출력** alert( 2 ** 3 ); // 8 (2 * 2 * 2)값을 반환한다.
let x = 2 * 2 + 1;
alert( x ); // 5
섞어 쓸 수 있다. (+=, *=, /=, -= 다 가능)
let n = 2;
n += 5; // n은 7이 됨(n = n + 5와 동일)
n *= 2; // n은 14가 됨(n = n * 2와 동일)
alert( n ); // 14
순차적으로 1을 더하거나 뺄때 사용한다.
i++
i--
i += 1
i -= 1
이때 ++이나 --는 피연산자 뒤에 올 수도, 앞에 올 수도 있다.
앞에 오면 전위형(prefix form), 뒤에 오면 후위형(postfix form)이라고 하며 각각 증감 후의 새로운 값을 반환하거나 증감 전의 기존 값을 반환하는 차이가 있다. (아래 예시의 결과값 참고)
let counter = 1;
let a = ++counter;
alert(a); // 2
let counter = 1;
let a = counter++;
alert(a); // 1
더 손쉽게 i += 1 을 사용해도 된다(추천).
크거나 작고(>, <), 같거나(==) 다름(!=)을 비교할 때 사용한다. 비교한 값은 Boolean 데이터로 반환한다.
alert( null == undefined ); // true
alert( null === undefined ); // false||(OR), &&(AND), !(NOT), 세 종류의 논리 연산자가 있다.
피연산자로 불린형뿐만 아니라 모든 타입의 값을 받을 수 있다.
result = a || b;
result = a && b;
alert( true && true ); // true
alert( false && true ); // false
AND 연산자(&&)의 우선순위는 OR 연산자(||)보다 높다.
a && b || c && d는 (a && b) || (c && d)와 똑같이 동작한다.
참이나 거짓의 반대값을 Boolean 데이터로 반환한다.
console.log(!true) // false
console.log(!false) // true
console.log(!0) // true
console.log(!!0) // false
OR 연산자를 사용할때, 0이나 ''(빈 문자)값을 사용하는 경우 예상치못한 결과가 발생할 수 있다. 이때 연산자??를 사용하면 Nullish(null과 undefined)를 만났을 때만 다음으로 넘어간다.
(값이 '확정'되어있는 변수를 찾거나, 변수에 기본값을 할당하는 용도로 사용할 수 있다.)
x = a ?? b
// 위 아래 두 코드는 같은 의미임
x = (a !== null && !== undefined) ? a : b;
??는 &&나 ||함께 사용하면 문법 에러(SyntaxError : Unexpected token)가 발생한다. 이를 피하려면 ()괄호를 사용해줘야 한다.객체나 배열의 아이템item이나 속성property을 전개(확장) 할 수 있다. *얕은 복사가 필요할 때 사용한다.
// 배열에 적용
const a = [1, 2, 3]
const b = [4, 5, 6]
const c = [...a, ...b]
console.log(c) // [1, 2, 3, 4, 5, 6]
// const d = a.concat(b) 도 같은 동작을 함
// 객체에 적용
const a = { x: 1, y: 2 }
const b = { y: 3, z: 4 }
const c = { ...a, ...b }
console.log(c) // { x: 1, y: 3, z: 4 }
// const d = Object.assign({}, a, b) 도 같은 동작을 함
// 인수에 적용
const a = [1, 2, 3]
function fn(x, y, z) {
console.log(x, y, z) // 1, 2, 3
}
fn(...a)
console.log(x, y, z) // Uncaught ReferenceError: x is not defined
// 나머지 매개변수에 적용(rest키워드 사용)
const a = [1, 2, 3, 4, 5, 6]
function fn(x, y, ...rest) {
console.log(x, y, rest)// 1 2 [3, 4, 5, 6]
}
fn(...a)
객체나 배열을 변수로 분해할 수 있게 해준다.
(함수의 매개변수가 많거나 매개변수 기본값이 필요한 경우 유용하다.)
// 배열의 경우
let arr = ["Hyunsoo", "Bae"]
let [firstName, surname] = arr;
// let [firstName, surname] = "Bora Lee".split(' ') 와 같은 동작을 한다.
console.log(firstName); // Hyunsoo
console.log(surname); // Bae
// 객체의 경우
let options = {
title: "Menu",
width: 100,
height: 200
};
let {title, width, height} = options; // 이때 순서는 상관없다.
// 고유한 속성의 이름으로 할당해서 꺼내 쓰는 것이기 때문에
// 속성 이름 그대로 변수로 만들어 사용할 수 있다.
console.log(title); // Menu
console.log(width); // 100
console.log(height); // 200
// 세 번째 요소는 필요하지 않음
let [firstName, , title] = ["Hyunsoo", "Bae", "Info", "republic of korea"]; // Hyunsoo, undefined, Info
console.log( title ); // Info
let a = 1
let b = 2
;[b, a] = [a, b]
console.log(a, b) // 2 1
// 배열의 경우
const arr = [1, 2, 3]
const [a, ...rest] = arr
console.log(a, rest) // 1 [2, 3]
//객체의 경우
let options = {
title: "Menu",
height: 200,
width: 100
};
let {title, ...rest} = options;
alert(rest.height); // 200
alert(rest.width); // 100
let guest = "You";
let admin = "Me";
[guest, admin] = [admin, guest];
alert(`${guest} ${admin}`); // Me You
const obj = { a: 1, b: 2, c: 3 }
let a, b, c
({ a, b, c } = obj) // 소괄호 사용
console.log(a, b, c) // 1 2 3
const obj = { a: 1, b: 2, c: 3 }
const { a: x, b: y, c: z } = obj
console.log(x, y, z) // 1 2 3
// "기본값"
let [name = "Guest", surname = "Anonymous"] = ["Hyunsoo"];
console.log(name); // Hyunsoo
console.log(surname); // Anonymous
점 표기법에 ?를 추가해 ?.로 사용하면 객체 속성이 없는 경우도 에러 없이 접근이 가능해진다. (에러 대신 undefined를 반환한다.)
let user = null
console.log(user) // null
console.log(user?.name) // undefined
//-----
const userA = {
a: 'Hyun',
b: 27,
c: {
cd: 'Bucheon',
ce: 'Korea'
}
}
const userB = {
a: 'Soo',
b: 23
}
function getCd(user) {
return user.c?.cd || 'cd 없음.'
}
console.log(getCd(userA)) // 'Bucheon'
console.log(getCd(userB)) // 'cd 없음.'
//괄호 안이 'truthy' 일때
if (1) {
... // 실행 됨
}
// 괄호 안이 'falsy' 일때
if (0) {
... // 실행되지 않음
}
if (0) {
... // 실행 되지 않음
} else {
... // 실행 됨
}
if (0) {
... // 실행 되지 않음
} else if (-0) {
... // 실행 되지 않음
} else {
... // 실행 됨
}
if (1 > 2) {
console.log('truthy')
} else {
console.log('falsy')
} // falsy가 출력 됨
console.log( 1 > 2 ? 'truthy' : 'falsy' ) // falsy가 출력 됨
활용 예)
let result = condition? value1 : value2;
let a = 1 > 2 ? true : false;
let resule = condition // condition 자체가 true나 false를 반환하므로 이렇게 더 축약해서 사용 가능!
let a = 1 > 2;
*if ~ else if ~ else처럼 물음표를 여러번 사용해서 조건을 처리하는 것도 가능하다.
let result = condition1 ? value1 :
condition2 ? value2 :
condition3
동일한 코드를 반복 실행 해야할 때 사용.
while (condition) {
// 반복 실행할 코드
}
do {
// 반복 실행할 코드
} while (condition);
for(초기화; 조건; 증감) {
// 실행할 코드
}
예시)
for (let i = 0; i < 3; i++) { // 0, 1, 2가 출력 됨
console.log(i);
}
*이미 블록 위에서 i 변수를 선언한 뒤라서 초기화; 부분에서 같은 내용을 써줄 뿐이라면, 생략도 가능하다.
let obj = {
a: 1,
b: 2,
c: 3
};
for (let prop in obj) {
console.log(prop, obj[prop]); // a 1, b 2, c 3
}
let iterable = [10, 20, 30];
for (let value of iterable) {
console.log(value); // 10, 20, 30
}
break로 반복문을 완전히 종료하거나, continue로 실행중인 이터레이션을 멈추고 다음 이터레이션을 강제 실행하도록 할 수 있다.
*이터레이션(iteration) : 반복문 본문(실행할 코드)이 한 번 실행되는 것
for (let i = 0; i < 10; i++) {
if (i == 3) { // i 가 3 와 같을 경우
break; // for 문 종료
}
console.log(i); // 0,1,2,
}
for (let i = 0; i < 10; i++) {
if (i % 2 == 0) { // i 를 2로 나눴을때 0이 되는 경우(= 짝수 인 경우)
continue; // 짝수 인 경우 실행하지 않고 다음 이터레이션(순회)으로 넘어감
}
console.log(i); // 1, 3, 5, 7, 9
}
? 오른쪽엔 break나 continue가 올 수 없다.
(i > 5) ? alert(i) : continue; // Uncaught SyntaxError: Unexpected token 'continue'
?를 if 대용으로 쓰지 말것!
복수의 조건문을 가독성있게 사용할 수 있다.
switch(x) {
case 'value1': // if (x === 'value1')
...
[break]
case 'value2': // if (x === 'value2')
...
[break]
default:
...
[break]
} // switch문이 끝나거나 도중에 break를 만나면 코드 실행을 종료한다
// x와 일치하는 case문이 없다면 default문의 코드가 실행된다(default문이 있는 경우)
*중간에 break를 넣어주지 않으면 해당되는 모든 코드가 실행되므로 주의할 것
https://jsdev.kr/t/for-in-vs-for-of/2938
https://ko.javascript.info/comparison
https://ko.javascript.info/destructuring-assignment