CodeIt

2주차

codingtori 2024. 5. 27. 13:38

에크마스크스크립트(ECMAScript)

: 자바 스크립트 표준 명세서; 자바스크립트 프로그래밍 언어의 표준

 

모던 자바스크립트 (Modern Javascript)

현 시점에 사용하기 적합한 범위 내에서 최신 버전의 표준을 준수하는 자바스크립트


Javascript 자료형 8

number, string, boolean, null, undefined, object, symbol, bigint

 

 

문장(Statements)

: 어떤 동작이 일어나도록 작성된 최소한의 코드 덩어리

 

표현식(Expressions)

: 하나의 값이 되는 모든 코드

 

 

Symbol

: 코드 내에서 유일한 값을 가진 변수 생성

const user = Symbol('설명')

 

똑같은 설명을 가진 symbol이라도 다르다

const symbol_A = Symbol('this is Symbol');
const symbol_B = Symbol('this is Symbol');

console.log(symbol_A === symbol_B); 		//false

 

 

BigInt

: 아주 큰 정수를 표현  (-> 자바스크립트의 숫자형 값에는 9000조 정도의 정수 표현의 한계가 존재하기 때문)

 

일반 정수 마지막에 알파벳 n을 붙이거나 BigInt 라는 함수 사용

console.log(9007199254740993n);
console.log(BigInt('9007199254740993'))

 

BigInt 타입끼리만 연산 가능, 소수 표현 사용불가

 

 

typeof 연산자

 

▷ null    ---   object

typeof null;	// object

 

function sayHi(){
	console.log('Hi!?!');
}

typeof sayHi;				// function

 

 

 

falsy vs truthy 값

 

falsy

    : false, null, undefined, NAN, 0, ''

▷truthy

    : [], {} , 나머지

 

 

 

AND 연산

왼쪽 값이 Truthy하면 오른쪽 값 리턴 / 왼쪽 값이 Falsy하면 그대로 왼쪽 값을 리턴

console.log('Codeit' && 'JavaScript');				// JavaScript
console.log('0' && NaN);					// NaN

 

OR 연산

왼쪽 값이 Truthy하면 왼쪽 값 리턴 / 왼쪽 값이 Falsy하면 오른쪽 값 리턴

console.log(0 || true);				//true
console.log({} || 123);				// {}

 

* AND 연산자가 OR 연산자보다 우선순위가 높다

 

 

 

null 병합 연산자 '??'

: 연산자 왼편의 값이 null이나 undefined             - 연산자 오른편의 값 리턴

: 연산자 왼편의 값이 null이나 undefined 아님     - 연산자 왼편의 값 리턴

const ex1 = null ?? 'I';					//I
const ex2 = false ?? 'codeit';					//false

 

 

 

var 문제점

1. 호이스팅                                                 2. 중복 선언 가능             

3. 변수의 유효범위(scope)에 차이 - var은 함수 단위로만 가능(: 지역변수 생성불가) : 함수 스코프

 

 

 

함수 선언 : 함수 선언을 변수에 할당하는 방식

const printCodeit = function(){
	console.log('Codeit');
};

printCodeit();

 

* 함수 표현식(Function Expression) : 함수 선언을 값 처럼 활용하는 방식

-- 기명 함수 표현식(Named Function Expression)

   자동으로 'name'이라는 프로퍼티 가짐

const sayHi = function printHiInConsole(){
	console.log('Hi');
};

console.log(sayHi.name);					//printHiInConsole

이때 이 함수이름은 함수 내부에서 함수 자체를 가리킬 때만 사용가능 - 외부에서 호출할 땐 불가능

 

+) 프로퍼티 이름과 값으로 사용할 함수, 변수 명이 같을 경우 한번만 적어줘도 됨

//ex
const title = 'Codeit';
const birth = 2017;

const user = {
	title,
    birth
};

 

함수 선언과 함수 표현식의 가장 큰 차이 : 호이스팅, 스코프

- 함수 표현식은 변수가 선언된 이후에 함수를 호출해야 동작

 

 

 

 

즉시 실행 함수(표현) Immediately Invoked Function Expression : IIFE

(function(x, y){
	console.log(x+y);
})(3, 5);

 

- 외부에서 재사용할 수 없음

- 선언과 동시에 실행이 이루어짐

 

--일급 함수

콜백 함수(Callback Function)
: 다른 함수의 파라미터에 전달된 함수

고차 함수(Higher Order Function)

: 함수를 리턴하는 함수

 

 

 

아규먼트(Argument)

: 함수를 호출하는 부분에서 파라미터로 전달하는 값에 해당하는 부분

'arguments' 라는 객체를 사용하여 유사 배열로 아규먼트 출력가능

함수에 'undefined' 값을 전달하면 기본값을 사용할 수 있다

function printArguments(){
	for(const arg of arguments){
    	console.log(arg);
   	}
    console.log('------------------');
};

printArguments('Young', 'Mark', 'Koby');
printArguments('Captain');

//Young
//Mark
//Koby
//-----------------------------------
//Captain

 

 

 

레스트 파라미터(Rest Parameter)

: 파라미터 앞에 ... 붙인 것

배열이므로, 배열의 메서드 모두 사용가능

//ex1
function printArguments(...args){
	console.log(args);
};
printArguments('Suri', 'Jack', 'Joy', 'Noel');


//ex2
function printRank(first, second, ...others){
	생략
}
printRank('Phil', 'Won', 'Emma', 'Min', 'Luke');

 

 

 

Arrow Function

: 이름이 없는 함수 

어떤 이름을 가진 변수에 할, 다른 함수의 아규먼트 선언

//ex1
const getTwice = (number) => {
	return number * 2;
};

	//간단하게 변경
const getTwice = number => number * 2;


//ex2
myBtn.addEventListener('click', () =>{
	console.log('button is clicked!');
});

내부의 동작이 return문 하나라면 return 키워드도 생략할 수가 있음 ; 이때 반환하는 값이 객체이면 소괄호로 한 번 감싸줌

 

 

 

this 키워드

기본값 : Window 객체

- arrow function --- 선언되기 직전의 유효한 this 값과 똑같은 값을 가짐

 

 

조건 연산자(Conditional operator) = 삼항 연산자

: 조건 ? truthy 할 때 표현식 : falsy 할 때 표현식

-- 내부에 변수나 함수를 선언한다거나 표현식이 아닌 문장은 작성할 수 없음

 

 

Spread 구문

: 여러 개의 값을 하나로 묶은 배열을 다시 각각의 개별 값으로 펼치는 문법

 

하나의 값이 아니라 여러 값을 가진 목록 -> 객체에 할당 가능, 변수에 할당 불가능

배열은 객체로 펼칠 수 있지만 객체는 배열로 펼칠 수 없

const numbers = [1,2,3];

console.log(numbers);
console.log(...numbers);

//[1,2,3]
//1 2 3

 

앞에 ... 을 붙이는 방식 레스트 파라미터와 동일

--> BUT rest parameter : 여러 개의 arguments 를 하나의 파라미터로 묶는 방식

 

> 배열 복사할 경우 편리하다 - 기존의 slice() 메소드 사용하여 배열 복사했던 것 필요 없어짐

//기존의 slice() 메서드 활용한 배열의 복사
const webPublishing = ['HTML', 'CSS'];
const interactiveWeb = webPublishing.slice();

interactiveWeb.push('JavaScript');

console.log(webPublishing);
console.log(interactiveWeb);

//['HTML', 'CSS']
//['HTML', 'CSS', 'JavaScript']



//Spread 구문을 활용한 배열의 복사
const webPublishing = ['HTML', 'CSS'];
const interactiveWeb = [...webPublishing, 'JavaScript'];

console.log(webPublishing);
console.log(interactiveWeb);

//['HTML', 'CSS']
//['HTML', 'CSS', 'JavaScript']

 

> 두 배열을 합친 새로운 배열을 만들 때도 간편해짐

const arr1 = [1,2,3];
const arr2 = [4,5,6];

const arr3 = [...arr1, ...arr2];
console.log(arr3);

//[1,2,3,4,5,6]

 

 

옵셔널 체이닝

옵셔널 체이닝 연산자 : ?.

function printCatName(user){
	console.log((user.cat === null || user.cat === undefined) ? undefined:
}

 

 

 

구조분해(Destructuring)

1. 배열

const rank = ['유나', '효준', '민환']
const [mackbook, ipad, airpods, coupon = '없음'] = rank;

변수의 개수 > 배열 길이 : 넘치는 변수 undefined 로 할당됨

변수의 개수 < 배열 길이 : 넘치는 배열 요소 할당 안됨

 

2. 객체

const macbook = {
	title : '맥북 프로 16형',
    price : 3690000,
    memory : '16GB',
    storage : '1TB SSD 저장 장치',
    display : '16형 Retina 디스플레이',
};

const {title, price} = macbook;

나머지 원리들은 배열이랑 비슷함

* 변수이름과 프로퍼티 네임이 같지 않을 경우

const {title: product, ...rest} = macbook;
//    프로퍼티네임 : 객체 이름

 

 

구조분해를 사용해서 여러 argument 가 아니라 하나의 배열을 전달 받는 함수로 바꿀 수 있음

= 함수의 파라미터 부분에서 바로 destructuring 문법 사용가능

// ex1
function printWinners([macbook, ipad, airpods, ...coupon]){
	//생략
}
const ranks = ['효준', '효신', '재훈', '소원', '현승', '종훈'];
printWinners(ranks);



//ex2
function printSummary({title, color, price}){
	//생략
}

 

- html에서 dom이벤트 다룰 때 사용 --> 매번 이벤트 객체 접근 불필요

const btn = document.querySelector('#btn');

btn.addEventListener('click', (event) => {
	event.target.classList.toggle('checked');
});


//구조분해 사용하면
btn.addEventListener('click', ({target}) => {
	target.classList.toggle('checked');
});

중첩 객체 구조 분해라는 것도 있다 --> 한번 더 destructuring 문법 사용하는 것

 

 

자바스크립트는 에러 발생 시 자동으로 에러 객체 생성

에러 객체 : 에러 이름(name), 에러 메세지(message)

종류)

        ReferenceError : 존재하지 않는 변수나 함수를 호출한 경우

        TypeError : 잘못된 방식으로 자료형 다루는 경우

        SyntaxError : 문법적으로 코드에 오류가 있는 경우(코드 실행전 에러 발생 시킴)

        ...etc....

 

에러객체 생성 (에러 발생 아님)

const error = new TypeError('타입 에러가 발생했습니다.');

 

에러 발생 (throw 키워드 사용)

throw error;

//에러 객체 출력
console.error(e);   //실제 에러 메세지처럼 출력할 경우

 

예외 (Exception) : 실행 가능한 코드에서의 에러 ➡️ try-catch문 이용

 

 

배열 만의 반복문

1. forEach

const members = ['영훈', '윤수', '동욱', '태호'];

members.forEach(function(member){
	console.log('${member}님이 입장하셨습니다.');
});

파라미터 : 배열의 요소 받아올 변수, 인덱스, 배열 자체

단순히 반복만 수행하므로 변수에 담을 경우 = undefined

 

2. map

메소드의 호출 결과로 새로운 배열을 리턴

const firstNames = ['영훈', '윤수', '동욱', '태호'];
const lastNames = ['강', '이', '손', '성'];

fistNames.map((firstName, i) => {
	return lastNames[i] + firstName;
});

 

 

 

특별한 조건에 따라 요소 찾는 것

filter 메소드

> 무조건 배열을 리턴함

> 결과값이 true/false 임

> 이 중 하나의 값을 찾는 것 == 'find 메소드'

 

filter  VS  find

> 리턴값

filter = 배열 / find = 값

> 반복횟수

filter = 모든 요소 / find = 하나 찾는 즉시 종료

 

 

 

some 메소드

: 조건을 만족하는 요소가 1개 이상 있는 지

 

every 메소드

: 모든 요소가 조건을 만족하는 지  (= 조건을 만족하지 않는 요소가 1개 이상 있는 지)

const numbers = [1, 3, 5, 7, 9];

const someReturn = numbers.some((el) => el>5);

const everyReturn = number.every((el) => el>5);

console.log('some: ', someReturn);		//true
console.log('every: ', everyReturn);	//false

 

 

 

 

reduce  메소드

const numbers = [1,2,3,4];

numbers.reduce((acc, el, i, arr) => {
	return nextAccValue;
}, initialAccValue);

콜백함수가 여러번 실행됨. 마지막 콜백함수의 리턴값이 결국 reduce 메소드의 리턴값.

각 콜백함수의 리턴값이 다음 콜백함수의 accumulator에 전달됨

 

 

 

배열 정렬

sort 메소드

아무런 아규먼트도 전달하지 않을 시, 유니코드에 정의된 문자열 순서대로 정렬

➡️메소드를 실행하는 원본 배열의 요소들을 정렬

 

reverse 메소드

배열의 순서를 뒤집어주는 메소드

파라미터 존재하지 않음

➡️메소드를 실행하는 원본 배열의 요소들을 정렬

 

 

Map

: 이름이 있는 데이터 저장

메소드를 통해서 값을 추가하거나 접근가능

 

메소드

○ map.set(key, value) : key를 이용해서 value를 추가하는 메소드

○ map.get(key) : key에 해당하는 값을 얻는 메소드. key가 존재하지 않으면 undefined 반환

○ map.has(key) : key가 존재하면 true, 존재하지 않으면 false를 반환하는 메소드

○ map.delete(key) : key에 해당하는 값을 삭제하는 메소드

○ map.clear() : Map 안의 모든 요소를 제거하는 메소드

○ map.size : 요소의 개수를 반환하는 프로퍼티 (메소드 아님)

 

Map 객체는 메소드를 통해 값을 다루므로, 다양한 자료형을 key로 활용할 수 있음

 

 

Set

: 여러개의 값을 순서대로 저장

메소드를 통해서 값 다룰 수 있음

 

메소드

set.add(value) : 값을 추가하는 메소드 (메소드를 호출한 자리에는 추가된 값을 가진 Set 자신 반환)

set.has(value) : Set 안에 값이 존재하면 true, 아니면 false를 반환하는 메소드

set.delete(value) : 값을 제거하는 메소드 (메소드를 호출한 자리에는 셋 내에 값이 있어서 제거에 성공하면 true, 아니면 false를 반환)

set.clear() : Set 안의 모든 요소를 제거하는 메소드

set.size : 요소의 개수를 반환하는 프로퍼티 (메소드 아님)

 

 

Map VS Set

일반 객체는 프로퍼티 네임으로, Map은 get 메소드로, 그리고 배열은 index를 통해 개별 값 접근. Set에는 개별 값에 접근하는 방법 없음

Set : 중복되는 값을 허용하지 않음

→ 배열 내에서 중복을 제거한 값들의 묶음을 만들 때 Set 활용

 

 

'CodeIt' 카테고리의 다른 글

3주차  (0) 2024.07.13
또 봐도 새로운 git/github  (1) 2024.07.06
유닉스 커맨드  (0) 2024.07.04
web_기초  (0) 2024.06.19
1주차  (0) 2024.05.19