// var: 함수 레벨 스코프, 중복 선언 가능, 호이스팅됨 (초기화는 undefined)
var x = 1;
// let: 블록 레벨 스코프, 중복 선언 불가, 호이스팅됨 (초기화 전 참조 불가)
let y = 2;
// const: 블록 레벨 스코프, 재할당 불가, 상수 값 정의에 사용
const z = 3;
// 인자가 2개일 때
const add = (a, b) => a + b; // return 생략 가능
// 인자가 1개일 때 괄호 생략 가능
const square = x => x * x;
// 인자가 없을 때는 괄호 필수
const sayHi = () => console.log("Hi");
// 여러 줄 로직이 있으면 중괄호 + return
const multiply = (a, b) => {
const result = a * b;
return result;
};
// 객체 반환 시 괄호 필요
const getUser = () => ({ name: "Alice", age: 30 });
// 배열 반환
const getList = () => [1, 2, 3];
// 배열 복사 및 추가
const arr = [1, 2, 3];
const newArr = [...arr, 4];
// 객체 복사 및 속성 덮기
const user = { name: "Tom" };
const newUser = { ...user, age: 20 };
// Rest 파라미터로 가변 인자 처리
const sum = (...nums) => nums.reduce((a, b) => a + b, 0);
// 객체
const person = { name: "Alice", age: 30 };
const { name, age } = person;
// 배열
const colors = ["red", "green", "blue"];
const [first, second] = colors;
const result = age > 18 ? "Adult" : "Minor";
const city = user?.address?.city; // 중첩 객체가 없어도 안전하게 접근 가능
const name = user.name ?? "Guest"; // null/undefined 시 기본값 지정
// 배열 요소 순회
for (const val of [1, 2, 3]) {
console.log(val);
}
// 객체 키 순회
const obj = { a: 1, b: 2 };
for (const key in obj) {
console.log(key, obj[key]);
}
let age: number = 30;
let name: string = "Alice";
let isActive: boolean = true;
let tags: string[] = ["ts", "react"];
let tuple: [string, number] = ["age", 30];
function greet(name: string): string {
return `Hello, ${name}`;
}
const add = (a: number, b: number): number => a + b;
interface User {
id: number;
name: string;
email?: string; // 선택적 속성
}
const user: User = { id: 1, name: "Tom" };
let value: string | number;
type Direction = "left" | "right";
function wrap<T>(value: T): T[] {
return [value];
}
const input = document.querySelector("#input") as HTMLInputElement;
const el = document.getElementById("app")!;
let text = "hello"; // string으로 추론됨
type Animal = { name: string };
type Dog = Animal & { breed: string }; // 교차 타입 (intersection)
function Hello({ name }: { name: string }) {
return <h1>Hello, {name}</h1>;
}
const [count, setCount] = useState<number>(0);
useEffect(() => {
console.log("Mounted or Updated");
return () => {
console.log("Clean up");
};
}, [count]);
// reducer 함수 정의
function reducer(state: number, action: { type: string }): number {
switch (action.type) {
case "INCREMENT": return state + 1;
case "DECREMENT": return state - 1;
default: return state;
}
}
const [count, dispatch] = useReducer(reducer, 0);
const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
alert("clicked");
};
return isLoggedIn ? <LogoutButton /> : <LoginButton />;
const items = ["A", "B"];
return (
<ul>
{items.map((item, index) => <li key={index}>{item}</li>)}
</ul>
);
const Card = ({ children }: { children: React.ReactNode }) => {
return <div className="card">{children}</div>;
};
const ThemeContext = React.createContext("light");
const App = () => (
<ThemeContext.Provider value="dark">
<Page />
</ThemeContext.Provider>
);
const Page = () => {
const theme = useContext(ThemeContext);
return <div>Current theme: {theme}</div>;
};
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Home from "./Home";
import About from "./About";
const App = () => (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</BrowserRouter>
);
JavaScript: 화살표 함수, 비구조화, 스프레드/Rest, 옵셔널 체이닝은 핵심 문법이다.
TypeScript: 타입 안정성을 위해 함수, 객체, 배열, 제네릭 등 모든 구조에 타입을 선언하는 것이 중요하다.
React: 상태 관리(useState
, useReducer
), 사이드이펙트(useEffect
), 라우팅(react-router-dom
), 전역 상태(Context API
)가 필수 개념이다.
Javascript - 구조분해 할당 (Destructuring Assignment) (0) | 2025.06.01 |
---|