24. 07. 19 TIL
2
1. 객체
키와 값의 쌍으로 구성된 데이터 구조.
1-2. 객체 선언
let user = {
name: "르탄이",
age: 30,
isAdmin: true,
printHello: () => console.log("hello!")
};
1-3. 객체 접근
점 표기법
console.log(user.name); // 르탄이
console.log(user.age); // 30
user.printHello(); // hello!
괄호 표기법
console.log(user['name']); // 르탄이
console.log(user['age']); // 30
let attribute = "name";
console.log(user[attribute]); // 르탄이
1-4. 객체 속성 추가 및 수정
user.email = "john.doe@example.com"; // 새로운 속성 추가
user.age = 31; // 기존 속성 수정
console.log(user);
1-5. 속성 삭제
delete user.email;
2. 배열
2-1) 접근, 수정
console.log(numbers[0]); // 배열 접근하기
numbers[2] = 10; // 배열 수정하기
console.log(numbers); // [1, 2, 10, 4, 5]
3. 주요 메서드
(객체)
1. object.keys()
객체의 키만을 추출해 배열로 반환
const user = { name: "르탄이", age: 30, isAdmin: true };
const keys = Object.keys(user);
console.log(keys); // ["name", "age", "isAdmin"]
2. object.values()
객체의 값만을 추출해 배열로 반환
const values = Object.values(user);
console.log(values); // ["르탄이", 30, true]
3. object.entries()
객체의 키와 값을 쌍으로 하는 배열을 반환
const entries = Object.entries(user);
console.log(entries); // [["name", "르탄이"], ["age", 30], ["isAdmin", true]]
4. object.assign()
하나 이상의 출처 객체로부터 대상 객체로 속성 복사
const userDetails = { occupation: "개발자" };
Object.assign(user, userDetails);
console.log(user); // {name: "르탄이", age: 30, isAdmin: true, occupation: "개발자"}
(배열)
1. push, pop
push -> 배열의 끝에 하나 이상의 요소 추가
pop -> 배열의 마지막 요소 제거
map -> 배열 내의 모든 요소 각각에 대해 주어진 함술르 호출한 결과를 모아 새로운 배열을 반환
filter -> 주어진 함수의 테스를 통과하는 모든 요소를 모아 새로운 배열로 반환
reduce -> 배열의 각 요소에 대해 주어진 함수를 실행하고, 결과물을 누적시켜 반환
sort -> 배열의 요소를 적절한 위치에 정렬하고 배열을 반환
// 기본 사용법
const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
console.log(fruits); // ["Apple", "Banana", "Mango", "Orange"]
// 숫자 배열 정렬
const numbers = [40, 100, 1, 5, 25];
numbers.sort((a, b) => a - b);
console.log(numbers); // [1, 5, 25, 40, 100]
// 내림차순 정렬
numbers.sort((a, b) => b - a);
console.log(numbers); // [100, 40, 25, 5, 1]
3
1. 템플릿 리터럴
백틱 사용
2. destructuring (구조 분해 할당)
객체, 배열 속성을 보다 쉽게 추출할 수 있게 해주는 문법
const { name, price } = item;
console.log(name); // 커피
console.log(price); // 4000
1-2) 함수 매개변수에서의 사용
function greet({ name, age }) {
console.log(`안녕하세요, 제 이름은 ${name}이고 나이는 ${age}살입니다.`);
}
greet({ name: "르순이", age: 28 });
2) 배열 destructuring
let colors = ["red", "green", "blue"];
let [firstColor, secondColor] = colors;
console.log(firstColor); // red
console.log(secondColor); // green
배열의 요소를 위치에 따라 변수로 할당한다.
3. spread operator 스프레드 연산자
1) 객체에서의 사용
객체의 속성을 다른 객체로 복사하거나 확장할 때 사용
const originalUser = { name: "르탄이", age: 28 };
const updatedUser = { ...originalUser, location: "한국" };
console.log(updatedUser); // { name: "르탄이", age: 28, location: "한국" }
2) 배열에서의 사용
두 배열을 간편하게 합칠 때 사용
const first = [1, 2, 3];
const second = [4, 5, 6];
const combined = [...first, ...second];
console.log(combined); // [1, 2, 3, 4, 5, 6]
4. rest operator
함수 매개변수, 객체 리터럴, 배열 리터럴에서 사용되며, 나머지 값을 하나의 변수로 그룹화하는 데 사용됨
주로 함수에서 여러 인수를 배열로 그룹화하거나,
객체 분해 할당에서 특정 속성을 제외한 나머지 속성들을 새 객체로 그룹화할 때 사용됨.
1) 함수 매개변수
function sum(...numbers) {
return numbers.reduce((acc, current) => acc + current, 0);
}
console.log(sum(1, 2, 3, 4)); // 10
여러 인수를 배열로 그룹화할 수 있다.
1-2) 객체 분해 할당
const person = {
name: "John",
age: 30,
country: "USA",
occupation: "Developer"
};
const { country, ...rest } = person;
console.log(rest); // { name: "John", age: 30, occupation: "Developer" }
특정 속성을 제외한 나머지 속성들을 새로운 객체로 그룹화할 수 있다.
(ex. country 속성을 제외한 나머지 속성들이 rest 객체에 저장됨)
4
단축평가
1. optional Chaning ?.
-> 객체의 속성에 접근할 때 해당 경로에 속성이 존재하지 않아도 에러를 발생시키지 않고 대신 undefinced를 반환함
2. null 병합 연산자 ??
-> 좌변이 null, undefined일 경우에만 우변을 평가.
null 또는 undefined가 아닌 falsy 값들을 유효한 값으로 처리하고 싶을 때 사용
5
모듈
모듈은 재사용 가능한 코드 조각을 캡슐화하고 다른 자바스크립트 파일에서 쉽게 재사용할 수 있게 해준다.
export 키워드 사용
고급 묘듈 기능
1. 별칭 사용
import 시 특정 요소에 별칭을 지정해 충돌을 방지하거나 명확성을 높일 수 있다.
import { square as sqr } from './utils.js';
console.log(sqr(4)); // 16
2. 기본 내보내기와 가져오기
한 모듈에서 하나의 기본값을 내보내고 이를 쉽게 가져올 수 있다.
모듈당 하나의 주요 기능을 내보낼 때 유용하다.
export default를 통해 내보낸 모듈은 import시 이름 변경이 가능하다.
// math.js
export default function multiply(x, y) { return x * y; }
// app.js
import multiply from './math.js';
console.log(multiply(6, 7)); // 42
6
비동기 작업
동기 작업 -> 한 번에 한 가지 일만 할 수 있다. 그래서 그 작업이 끝날 때까지 다른 작업을 할 수 없다.
비동기 작업 -> 비동기 작업은 여러 가지 일을 동시에 할 수 있다. 그 작업이 끝나지 않아도 다른 작업을 할 수 있다.
promise -> 자바스크립트에서 비동기 작업을 처리하는 방법 중 하나
예를 들면 웹사이트에서 데이터를 서버로부터 가져오는 작업이 이에 해당됨
이때 promise는 그 작업이 끝나면 알려주는 일종의 약속
promise는 세 가지 상태가 있는데
1. pending (대기 중) : 작업이 아직 끝나지 않은 상태
2. fulfilled (이행됨) : 작업이 성공적으로 끝난 상태
3. rejected (거부됨) : 작업이 실패한 상태
async, await
-> async가 붙은 함수는 반드시 promise를 반환한다.
비동기 작업을 더 쉽게 쓸 수 있게 해주는 방법
async = 함수 앞에 붙여서 그 함수가 비동기 작업을 할 거라고 알려줌
await = async 함수 안에서만 쓸 수 있음
fetch, then
-> promise 객체를 반환한다.
promise는 두 개의 메서드를 사용할 수 있는데 then과 catch이고, 둘 다 콜백 함수를 받는다.
웹사이트에서 데이터를 가져올 때 사용하는 함수
서버에서 데이터를 받아오고, 그 데이터를 처리할 수 있게 도와줌
fetch = 데이터를 가져옴
then = 데이터가 준비되면 then을 사용해서 데이터를 처리함, 오류가 발생하면 catch로 처리함
axios
-> fetch와 비슷하지만 더 사용하기 편리한 라이브러리
주로 서버에서 데이터를 가져오거나 보낼 때 사용
역시 promise를 반환하고 then과 함께 사용해 데이터를 처리함
정리
Promise와 then/catch
promise를 사용하면 비동기 작업이 끝난 후의 처리 방법을 resolve(성공)와 reject(실패)를 통해 명시한다.
then은 resolve가 호출되었을 때 실행되는 함수, catch는 reject가 호출되었을 때 실행되는 함수다.
const myPromise = new Promise((resolve, reject) => {
let 성공 = true; // 비동기 작업이 성공했는지 여부
if (성공) {
resolve('성공!'); // 작업이 성공했을 때
} else {
reject('실패!'); // 작업이 실패했을 때
}
});
myPromise
.then((message) => {
console.log(message); // '성공!' 출력
})
.catch((error) => {
console.error(error); // '실패!' 출력
});
async/await
async. await는 비동기 작업을 동기적으로 작성할 수 있게 해준다.
async 키워드가 붙은 함수는 항상 promise를 반환하고
await 키워드는 promise가 해결될 때까지 기다린다.
이 방법을 사용하면 promise 객체와 resolve, reject를 직접 사용할 필요가 없다.
async function fetchData() {
try {
let response = await fetch('https://api.example.com/data'); // 비동기 작업을 기다림
let data = await response.json(); // 데이터를 JSON으로 변환
console.log(data); // 데이터를 출력
} catch (error) {
console.error('데이터를 가져오는 중에 오류가 발생했어요.', error); // 오류 처리
}
}
fetchData();
axios
비동기 작업을 처리하기 위한 http 클라이언트 라이브러리
더 쉽고, 추가 기능이 있고, 브라우저와 노드js에서 모두 사용 가능하다.
즉, fetch는 브라우저 내장 함수고, axios는 외부 라이브러리다.
비동기 작업은 시간이 오래 걸리는 작업을 처리할 때 사용됨
1. 네트워크 요청 -> api 호출, 파일 다운/업로드
2. 파일 입출력 -> 파일을 읽거나 쓴느 작업
3. 타이머 관련 작업 -> 특정 시간 동안 대기, 주기적으로 반복되는 작업
4. 대량 데이터 처리
5. 사용자 인터페이스 작업 -> 버튼 클릭시 데이터 가져오기, 폼 제출 시 데이터 처리
등