변수 let
상수 const
자료형
형 변환
연산자
조건문
함수
함수표현식
함수선언식
화살표함수
콜백함수
객체
배열
반복문
배열내장함수
패스트캠퍼스 리액트 강의가 다소 어렵게 느껴져서 3주 전에 Udemy
에서 리액트
강의를 신청했다.
실전 프로젝트를 하기 전 자바스크립트 개념을 약 4시간 반 정도 강의로 요약해주는데
오히려 이 강의를 보고 책이나 블로그보다 더 자바스크립트에 대해 이해한 부분이 많아 복습에 도움이 됐다!
원시타입/비원시타입, 콜백함수, 호이스팅, 함수선언식/표현식, 객체, 배열 등등 헥갈린 기본 개념들을 쉽게 이해할 수 있었다. (특히 지난 자바스크립트 퀴즈를 풀 수 있었던 것도 이 강의를 돌려보고 MDN 등 활용했기에.)
💬 강사 이력을 보니 정말 우연하게도 나와 같은 학교의 컴퓨터공학과 학생인 주니어 개발자였는데 내가 동년배가 아니라서(...) 같이 학교를 다닌 건 아니나 이 자리를 빌어서 후배님에게 고맙다고 전하고 싶다. 좋은 강의 & 명쾌한 설명 👍 (찾아보니 같은 과 학생들끼리 랩실 창업을 한거 같다.. 젊음이 부럽다)
GitHub https://github.com/winterlood
💬 생각해보면 예전 직장에서도 프로젝트로 온 개발자 중 친해졌던 여자개발자분이 있었는데
대화하다보니 같은 학교였던 걸 알게되었고 그분도 개발 프로젝트라든가 흐름을 많이 설명해줬던 기억😃
💬 원래 인프런에서도 팔던 강의인데 사실 Udemy가 조금 더 쌌다. 그리고 교육플랫폼끼리 비교해서 들어보려고 한번 Udemy 수강도 첨으로 도전! (근데 Udemy 잘되있긴 한데 가끔 속도가 너무 끊김..)
변수
let
변하는 것, 값이 계속 바뀌는 이름붙은 저장소라고 생각하기
상수
const
변하지 않는 것, 선언 이후에 값을 바꿀 수 없다
원시타입 (Primitive Data Type)
= 내장형 타입, 기본형 타입
비원시타입 (Non-Primitive Data Type)
let age = 25;
let tall = 175.9;
let inf = Infinity; // 양의 무한대
let minusInf = -Infinity; // 음의 무한대
let nan = NaN; // 수학적 연산 실패의 결과값
console.log(age * tall);
let name = "winterlood";
let name2 = "이정환";
let name3 = `winterlood ${name2}`; // ``(벡틱) 안에 문자열 집어넣는 문법 > 템플릿 리터럴
console.log(name3);
let isSwitchOff = false; // 거짓
let isSwitchOn = True; // 참
let a = null; // 의도적으로 이 변수는 아무것도 안 담고 있다를 가리킬 때 사용
console.log(a);
let variable; // 값을 아무것도 할당하지 않으면 undefined를 자동으로 할당
console.log(variable);
묵시적 형변환
: 암묵적으로 형 변환명시적 형변환
: 프로그래마가 의도적으로 형 변환 (ex. parseInt)let numberA = 12;
let numberB = 2; // Number
console.log(numberA * numberB) // 24
let numberA = 12;
let numberB = "2"; // String
console.log(numberA * numberB) // 24 (형변환)
let numberA = 12;
let numberB = "2"; // String
console.log(numberA + numberB) // 122 (더하면 12에 2를 더한 문자형으로 출력)
let numberA = 12;
let numberB = "2"; // String
console.log(numberA + parseInt(numberB)) // 14 (parseInt 문자>숫자로 돌려줌)
// 📝 대입연산자
let a = 1;
let b = 2;
// 📝 산술연산자 (사칙연산)
console.log(a + b); // 3
console.log(a * b); // 2
console.log(a - b); // -1
console.log(a / b); // 0.5
console.log(a % b); // 1
// 📝 연결연산자
let a = "1";
let b = "2";
// let b = 2여도 동일한 결과가 나옴 (묵시적형변환 개념)
console.log(a + b); // 12
// 📝 복합연산자
let a = 5;
a += 10; // a = a + 10; 근데 a가 두번나오게 하고 싶지 않다
console.log(a); // 15;
a -= 10; // a = a - 10;
console.log(a); // -5
// 📝 증감연산자 (원시타입 중 숫자에만 사용할 수 있다)
let a = 10;
a++; // a += 1;
console.log(a); // 11
a--; // a -= 1;
console.log(a); // 9
// 증감연산자는 ++a와 a++의 결과값이 다름
console.log(a++); // 10
console.log(a); // 11 (증감연산자 뒤에 쓰는 방식 : 후희연산)
console.log(--a); // 9 (증감연산자 앞에 쓰는 방식 : 전희연산)
// 📝 논리연산자 (참/거짓 boolean)
console.log(!true); // false (!는 not을 의미)
console.log(!false); // true
// AND : true(피연산자) AND(연산자,shift+숫자7) true(피연산자)
console.log(true && true); // true
console.log(true && false); // false
// OR : true OR false
console.log(true || false); // true
console.log(false || true); // true
console.log(false || false); // false
// 📝 비교연산자1
// =는 대입, ==는 비교연산자
// compareA 변수에 == "1"이 저장된거라고 보면 됨
let compareA = 1 == "1";
console.log(compareA); // true
// 왜 true냐면 자바스크립트에서 == 두번 쓰면 이 비교 연산이 값만 비교하게 됨
// 설령 타입이 다르더라도 값이 똑같기 때문에 true라고 출력하게 됨
// 값뿐만 아니라 자료형까지 똑같은 걸 비교하고 싶을 때는
let compareA = 1 === "1";
console.log(compareA); // false
// 값뿐만 아니라 타입까지 비교해서 false 출력
// 값만 비교할 때는
let compareA = 1 != "1"; // 같지않다
console.log(compareA); // false
// 값과 타입까지 비교할 때는
let compareA = 1 !== "1";
console.log(compareA); // true
📝 비교연산자2
let compareA = 1 > 2;
console.log(compareA); // false
let compareA = 1 <= 2;
console.log(compareA); // true
📝 자료형 확인 연산자
let compareA = 1;
console.log(typeof compareA); // number
compareA = "1";
console.log(typeof compareA); // string
📝 null 병합 연산자
let a; // 자동으로 undefined 할당
a = a ?? 10; // ?? 양쪽의 피연산자 중 null이나 undefined가 아닌 값을 선택함
console.log(a); // 10
조건문이란 어떤 연산의 결과의 참거짓에 따라서 다른 명령을 각각 실행할 수 있도록 도와주는 문법
let a = 3;
if(a >= 5){ // 조건식이 일치할 때는 이 곳이 실행
console.log("5 이상입니다.");
}
else{ // 일치하지 않으면 이 곳이 실행
console.log("5 이하입니다.");
}
// 5 이하입니다.
let a = 5;
if(a >= 7){ // 이 조건 먼저 검사
console.log("7 이상입니다.");
}
else if(a >= 5){ // if 조건이 거짓일 때 한번 더 비교할 때 (여러 개 넣을 수 있음)
console.log("5 이상입니다.");
}
else{ // 위에 조건 모두가 아니면
console.log("5 미만입니다.");
}
// 5 이상입니다.
let country = "ko";
if(country == "ko"){
console.log("한국");
}
else if(country === "cn"){
console.log("중국");
} else if(country === "jp"){
console.log("일본");
} else {
console.log("미 분류");
}
// 한국
그런데 지구상에 존재하는 국가가 200개가 넘는데 모두 else if를 걸어줄 수 없으므로 다른 조건문 사용
let country = "ko";
switch(country){ // country를 case들과 비교하는 조건문
case "ko":
console.log("한국");
break; // 적절한 타이밍에 조건들이 다 실행되지 않게 끊어줌
case "cn":
console.log("중국");
break;
case "jp":
console.log("일본");
break;
case "uk":
console.log("영국");
break;
default: // else if 개념이라고 보면 됨
console.log("미 분류");
break;
}
// 한국
프로그래밍을 하다보면 똑같은 동작을 하는 코드들이 여러 곳에 존재하는데
이럴 때 함수라는 것을 만들어서 중복되는 동일한 코드를 하나로 묶어서 재사용할 수 있음
함수
선언
매개변수
반환
전역변수
지역변수
// 직사각형의 면적 계산하기
let width1 = 10;
let height1 = 20;
let area1 = width1 * height1;
console.log(area1); // 200
// 너비가 다른 직사각형 두 개를 만든다면?
let width2 = 30;
let height2 = 15;
let area2 = width2 * height2;
console.log(area2); // 450
// 그런데 너비와 높이의 값만 달라지고 수식은 같고 똑같은 동작인데..?
// 만약 너비와 높이에 주어지는 값이 10개 넘으면 중복해서 일일이 코드를 써야할까..?
// 함수를 만들 때는 function을 쓴다 (기능)
// 함수 선언식 , 함수 선언 방식의 함수 생성
function getArea(){
let width = 10;
let height = 20;
let area width * height;
console.log(area);
}
// 📝 함수 호출
getArea(); // 200
console.log("함수 실행 완료"); // 함수 실행 완료
// 📝 동작 순서
// 1. 함수 생성
// 2. 함수 호출
// 3. 함수 중괄호 안으로 제어가 넘어와서 실행해서 내부 코드 실행
// 4. "함수 실행 완료" 실행
// 그런데 너비와 높이 값을 함수 호출 할 때 던져서 실행하면?
// 📝 매개변수(인자)
function getArea(width, height){
let area = width * height;
console.log(area);
}
getArea(100,200); // 20000
getArea(10,200); // 2000
getArea(1,200); // 200
getArea(100,200); // 20000
getArea(10,200); // 2000
console.log("함수 실행 완료"); // 함수 실행 완료
// 📝 함수의 결과값을 변수에 받아보고 싶다면?
function getArea(width, height){
let area = width * height;
return area; // 어떤 값을 리턴
}
let area1 = getArea(100,200); // 여기에 반환하여 변수에 대입
console.log("area1 : ", area1); // area1 : 20000
console.log("함수 실행 완료"); // 함수 실행 완료
let count = 1; // 📝 전역변수(global)
function getArea(width, height) {
// 📝 지역변수
let area = width * height; // 함수 내부에서 선언된 변수
console.log(count);
return area;
}
let area1 = getArea(100, 200);
console.log(area); // 바깥에서 이용하려고 하면 error
함수 표현식
함수 선언식
호이스팅
// 📝 함수 표현식
let hello = function() { // 이름을 명시(지정)하지 않아도 됨 (무명함수)
return "안녕하세요 여러분";
}
// 📝 함수 선언식
function helloFunc() {
return "안녕하세요 여러분";
}
const helloText = hello();
console.log(helloText); // 안녕하세요 여러분
// 📝 함수 표현식과 선언식은 어떤 차이가 있을까?
// 📝 hoisting(호이스팅)
// "함수 선언식"으로 만들어진 함수들은 코드의 최상단으로 끌어올려진다
// 가장 밑바닥에 선언을 해도 정상적으로 위에서 호출해서 사용할 수 있다.
// "함수 표현식"은 호이스팅 대상에 해당되지 않음 (직접적으로 선언되기 전에는 접근 불가)
console.log(helloB()); // 안녕하세요 여러분
console.log(helloA()); // TypeError:helloA is not a function
let helloA = function() {
return "안녕하세요 여러분";
} // helloA는 함수 표현식
function helloB() {
return "안녕하세요 여러분";
} // helloB는 함수 선언식
let helloA = function() {
return "안녕하세요 여러분";
}
let helloA = () => {
return "안녕하세요 여러분";
}
// 만약 리턴 밖에 안하는 함수라면?
let helloA = () => { };
// 또는 구현하는 게 "안녕하세요 여러분"만 있으면
let helloA = () => "안녕하세요 여러분";
콜백함수는 어떤 다른 함수
에 매개변수
로 함수
를 넘겨준 것을 의미
// 기분에 따라 다른 동작을 하게 하는 함수를 만들어보자
function checkMood(mood) {
if(mood === "good"){
// 기분이 좋을 때 하는 동작
sing();
}
else {
// 기분이 안 좋을 때 하는 동작
cry();
}
}
// 우는 동작
function cry(){
console.log("ACTION :: CRY😂");
}
// 노래하는 동작
function sing() {
console.log("ACTION :: SING🎤 ");
}
// 춤추는 동작
function dance() {
console.log("ACTION :: DANCE🤩");
}
checkMood("good"); // ACTION :: SING🎤
checkMood("sad"); // ACTION :: CRY😂
// 그런데 위의 코드대로면 고정된 동작만 할 수 밖에 없음 (다른 동작을 하려면 일일이 바꿔줘야 함)
// 더 융통성있게 코드화한다면?
// 기분이 좋을 때 하는 동작(goodCallback) 파라미터
// 기분이 안 좋을 때 하는 동작(badCallback) 파라미터 받아서 수행하도록 변경
// 📝 콜백 함수 : 함수표현식의 개념 이용해서 함수 자체를 매개변수에 값을 담아서 호출
function checkMood(mood, goodCallback, badCallback) {
if(mood === "good"){
// 기분이 좋을 때 하는 동작
goodCallback();
}
else {
// 기분이 안 좋을 때 하는 동작
badCallback();
}
}
// 우는 동작
function cry(){
console.log("ACTION :: CRY😂");
}
// 노래하는 동작
function sing() {
console.log("ACTION :: SING🎤 ");
}
// 춤추는 동작
function dance() {
console.log("ACTION :: DANCE🤩");
}
checkMood("sad", sing, cry); // ACTION :: CRY😂
checkMood("good", sing, cry); // ACTION :: SING🎤
// 📝 객체 생성자
let person = new Object();
// 📝 객체 리터럴 방식
// 많은 프로그래머들이 코드 작성 시에는 리터럴 방식으로 다루기 때문에 익숙해지는 것이 좋음
let person = {
// key와 value를 쌍으로 갖는 것을 "(객체) 프로퍼티"라 함
// 객체가 가지고 있는 속성 = 데이터라고 이해해도 좋음
// key는 문자형만, value는 어떤 형이 와도 상관없음
// key를 중복해서 사용하는 것은 권장하지 않음
key: "value",
key0 : 123,
key1 : "value2"
key2: true,
key3: undefined,
key4 [1,2],
key5: function(){}
};
console.log(person); // {key:"value", key1:"value2", ...}로 중괄호에 묶어서 출력(펴서 볼 수 있음)
// 📝 객체의 프로퍼티를 사용하는 방법
let person = {
key: "value",
key0 : 123,
key1 : "value2"
key2: true,
key3: undefined,
key4 [1,2],
key5: function(){}
};
// 📝 점표기법
console.log(person.key0); // 123
console.log(person.key2); // true
let person = {
name: "이정환",
age: 25
}
console.log(person.name); // 이정환
console.log(person.age); // 25
// 📝 괄호표기법 [""] <- 문자형 형태로 넣기
console.log(person["name"]); // 이정환
// 그런데 만약 ""을 안 쓸거라면 상수에 받아서
const name = "name";
console.log(person[name]); // 이정환
// 📝 괄호표기법을 이용하면 좋은 상황은 동적은 파라미터를 전달받는 이런 상황 또는
// 지금 현재 key를 꺼내야하는데 그 key가 고정되어 있지 않은 상황에는 유용하다!
// 2) 여기에 호이스팅해서
console.log(getPropertyValue("name")); // 이정환
function getPropertyValue(key){
return person[key];
} // 1) 이 함수는 함수 선언식이니까 호이스팅이 가능하니까..
// 📝 객체 생성 이후 프로퍼티를 추가/수정/삭제하는 방법
let person = {
name: "이정환",
age: 25
}
// 📝 프로퍼티 추가
person.location = "한국";
person["gender"] = "남성";
console.log(person); // {name: "이정환", age: 25, location: "한국", gender: "남성"}
person.name = "이정환 A";
person["age"] = 40;
console.log(person); // {name: "이정환 A", age: 40, location: "한국", gender: "남성"}
// 📝 객체를 변수(let)으로 만들었는데 상수(const)로 바꾸면 어떻게 될까?
const person = {
name: "이정환",
age: 25
}
person.name = "이정환 A";
person["age"] = 40;
console.log(person); // {name: "이정환 A", age: 40"}
// 프로퍼티를 수정하는 행위는 상수 자체를 수정하는 행위가 아니기 때문에 에러가 일어나지 않음
// 객체를 수정하는 것이지 person이라는 상수 자체를 수정하는 게 아님
// person = {age: 20} 이렇게 대입 연산자로 할당하는 게 아니므로 (상수 훼손)
// 📝 프로퍼티 삭제
const person = {
name: "이정환",
age: 25
}
delete person.age;
// 또는 delete person["age"];
// 그런데 이렇게 삭제해도 메모리에서 실제 프로퍼티가 지워지는 것은 아님
// person.age = null;
// 📝 이런 경우도 삭제한 것과 똑같고 delete와 달리 null을 쓰게되면
// 기존 메모리에서 value를 날릴 수 있음 (실제 삭제해야 할 경우에는 이런 방향을 추천)
console.log(person); // {name: "이정환"}
// 📝 객체 프로퍼티에 함수 할당된 경우
const person = {
name: "이정환", // 멤버
age: 25, // 멤버
say: function() {
console.log("안녕");
} // 객체의 프로퍼티로 함수를 담는 것을 메서드라고 함 (함수인 프로퍼티들)
// 📝 지칭할 때 name 멤버는, age 멤버는~
// 📝 say 메서드에서~
}
// 📝 함수인 경우 점표기법으로 접근해 사용
person.say(); // 안녕
person["say"]; // 안녕
// 📝 name의 value를 say 메서드에 넣기
const person = {
name : "이정환",
age: 25,
say: function() {
console.log(`안녕 나는 ${this.name}`);
// console.log(`안녕 나는 ${this["name"]}`);
// 여기서 쓰인 this는 자기 자신 객체임 = ${person["name"]}라고 쓴 것과 같음
}
}
person["say"]; // 안녕 나는 이정환
// 📝 존재하지 않는 프로퍼티에 접근해서 오류 발생
console.log(person.gender); // undefined
// 📝 프로퍼티 존재 여부를 확인하는 방법 (in 연산자)
const person = {
name: "이정환",
age: 25,
say: function(){
console.log(`안녕 나는 ${person["name"]}`);
}
}
console.log(`name : ${"name"} in person`); // name : true
console.log(`age : ${"age" in person}`); // age : true
console.log(`gender : ${"gender" in person}`); // gender : false
// 📝 배열 생성자
let arr = new Array();
// 📝 배열 리터럴
let arr = []; // 객체는 {} 중괄호, 배열은 [] 대괄호
console.log(arr); // []
// 📝 배열을 생성하면서 동시에 값 넣기
let arr = [1,2,3,4];
console.log(arr); // (4) [1,2,3,4]
// 📝 배열에는 객체와 마찬가지로 다양한 자료형이 올 수 있다
let arr = [1, "2", true, null, undefined, {}, [], function(){} ];
// 📝 배열 요소에 접근하기
// 배열은 객체와 다르게 value만 나열되 있음
// 배열이 위치한 순서는 index라고 부름. 이 index를 통해 각각의 값에 접근할 수 있음
let arr = [1,2,3,4,5]
console.log(arr); // (5) [1,2,3,4,5]
console.log(arr[0]); // 1
console.log(arr[1]); // 2
console.log(arr[2]); // 3
// 📝 배열 추가하기 (push)
let arr = [1, 2, 3, 4, 5];
arr.push(6); // 배열의 가장 마지막에 추가
// arr.push({key: "value"});
console.log(arr); // (6) [1,2,3,4,5,6]
// console.log(arr); // (6) [1,2,3,4,5,Object]
// 📝 배열의 길이를 변수로 받아오기 (length)
let arr = [1, 2, 3, 4, 5];
arr.push("6");
console.log(arr.length); // 6
프로그래밍
이라는 것은 조건
과 반복
에 의해 완성된다라는 말이 있을 정도로반복문
은 프로그래밍에 있어서 굉장히 중요함.반복문
을 이용하면 배열의 원소를 한번씩 다 접근하는 등에 매우 여러가지의 효율적인 작업을 할 수 있음.// 📝 내 이름 5번 출력하기
console.log("winterlood");
console.log("winterlood");
console.log("winterlood");
console.log("winterlood");
console.log("winterlood"); // (5) winterlood
// 그런데 이걸 100번이나 출력해야 한다면 어떨까?
// 100줄 코드를 써야할까?
// 📝 반복문을 통해 중복되는 코드를 줄이자
// 📝 for문
// for (변수 i 선언 후 값 할당; 조건식; 증감연산자(후희연산자) )
for (let i = 1; i <= 100; i++ ) {
// 반복 수행할 명령
console.log("winterlood"); // (100) winterlood
}
// 📝 for 문 뜯어보기 : 이 3개가 합쳐져서 동작한다
// 초기식 : let i = 1;
// 반복의 주체가 되는 부분을 선언할 수 있음
// 조건식 : i <= 100;
// 반복이 이 조건을 만족할 때만 돌아가게 하라는 뜻으로 명시 (초기식에서 선언한 변수 i)
// 연산식 : i++
// 반복할 때마다 할 연산을 적어주기
// 초기식으로 반복문이 수행이 시작되면서 i라는 변수에 1이라는 값을 할당해서 초기화를 한다.
// 이 i는 반복문은 연산식에 의해서 반복문을 수행할 때마다 1씩 증가한다.
// 그리고 이 반복문은 100 이하일 때는 계속해서 수행한다.
// 1,2,3, ... 100번의 코드가 반복수행
// 📝 배열 순회
// 이 for문은 배열을 순회할 때 매우 유용하게 사용할 수 있음
// 순회라는 것은 배열 내의 모든 요소를 한번씩 접근하는 것을 의미
const arr = ["a", "b", "c"];
for (let i = 0; i <= arr.length; i++){
console.log(arr[i]); // a b c
}
// 📝 객체 순회 Object.keys
let person = {
name: "이정환",
age: 25,
tall: 175
}
const personKeys = Object.keys(person);
console.log(personKeys); // (3) ["name", "age", "tall"]
// 📝 이런 식으로 객체로 반환해서 돌려준 이 객체를 순회하면 됨
for (let i=0; i < personKeys.length; i++){
console.log(personKeys[i]); // name age tall
}
// 📝 key 값 말고 value를 순회하면
for (let i=0; i < personKeys.length; i++){
const curKey = personKeys[i];
const curValue = person[curKey];
console.log(`${curKey} : ${curValue}`); // name : 이정환 age : 25 tall : 175
}
// 📝 key를 뽑지않고 value들만 순회한다면 Object.valus
// 객체의 value들을 for문을 이용해서 순회
let person = {
name: "이정환",
age: 25,
tall: 175
}
const personValues = Object.valus(person);
for (let i=0; i<personValues.length; i++){
console.log(personValues[i]); // 이정환 25 175
}
내장 함수
를 가지고 있음// 📝 for문 복습
const arr = [1,2,3,4];
for (let i=0; i<arr.length; i++) {
console.log(arr[i];)
}
// 자바스크립트의 자료형은 모두 객체로 이루어져있다
// 객체의 메서드를 쓰는 것처럼 배열 내장 함수 사용
// 📝 forEach
// 마치 for문을 작성한 것처럼 배열의 요소를 하나하나씩 출력 가능
arr.forEach((elm) => console.log(elm)); // 1 2 3 4
// 이거슨 어디서 본거냐 바로 콜백함수임
// 이렇게 쓴 것과 같은 것임 (elm 파라미터로 전달해주면서 원하는 작업을 하게 해줌)
arr.forEach(function(elm){
console.log(elm); // 1 2 3 4
console.log(elm*2); // 2 4 6 8
});
// 📝 주어진 arr 상수 배열에 모든 요소에 x 2를 해서 새로운 배열로 만들기
const arr = [1,2,3,4];
const newArr = [];
arr.forEach(function(elm){
newArr.push(elm * 2);
});
console.log(newArr); // (4) [2,4,6,8]
// 위의 코드를 더 짧게 줄이는 방법
// 📝 Map
// 동일하게 콜백함수를 수행한다고 보면 됨 그런데 한번씩 리턴을 받음
// 원본배열에 모든 요소를 순회하면서 어떤 연산을 하여
// 리턴된 이 값들만 따로 배열로 추려내서 반환할 수 있게 해주는 내장함수
const arr = [1,2,3,4];
const newArr = arr.map((elm) => {
return elm * 2;
});
console.log(newArr); // (4) [2,4,6,8]
// 📝 배열에 값이 존재하는지 확인
const arr = [1,2,3,4];
let number = 3;
arr.forEach((elm) => {
if (elm === number) { // elm이 3이 될 경우
console.log(true); // true
}
})
// 📝 includes
// 주어진 배열에서 전달받은 인자와 일치하는 값이 존재하는지 boolean식으로 확인하는 내장함수
const arr = [1,2,3,4];
let number = 3; // "3"; 이면(문자형)
console.log(arr.includes(number)); // true (문자형이면 false)
// 📝 indexOf
// 주어진 요소가 존재하는지 안하는지 뿐만 아니라 존재하면 몇번째에 있는지 인덱스를 출력하는 내장함수
// 전달받은 인자와 일치하는 값의 인덱스를 반환
// 일치하는 게 하나도 없을 경우 -1 반환
// 존재하는 값을 인자로 전달하면 위치하는 순서를 반환
const arr = [1,2,3,4];
let number = "3";
console.log(arr.indexOf(number)); // -1
// 📝 findIndex
// 복잡한 객체들도 포함하는 배열일 경우에는 원하는 속성을 갖는 배열의 요소의 인덱스를 갖다주는 내장함수
// findIndex를 이용하면 콜백함수를 사용해서 해당 함수가 true를 반환하는
// 첫번째 요소를 반환하는 로직을 작성할 수 있음
const arr = [
{ color: "red" },
{ color: "black" },
{ color: "blue" },
{ color: "green" }
];
console.log(arr.findIndex((elm)=>elm.color === "green")); // 3
console.log(arr.findIndex((elm)=>elm.color === "red")); // 0
// 📝 화살표 함수가 익숙하지 않다면..?
console.log(
arr.findIndex((elm) => {
return elm.color === "red";
})
); // 0
// 주의할 점
// findIndex의 경우 일치하는 조건의 요소가 2개있을 경우 가장 먼저 만나는 인덱스를 반환함
// (처음부터 끝까지 순회하면서 조건에 일치하는 첫번째 인덱스를 반환하므로)
// 📝 찾고자하는 요소에 직접 접근하고 싶다 배열의 인덱스 활용
const arr = [
{ color: "red" },
{ color: "black" },
{ color: "blue" },
{ color: "green" },
{ color: "blue" }
];
const idx = arr.findIndex((elm)=>elm.color === "green");
console.log(arr[idx]); // {color:"green"};
// 📝 find
// 이 조건을 만족하는 요소 자체를 반환받음
const element = arr.find((elm)=>elm.color === "blue");
console.log(element); // {color:"blue"};
// 📝 filter
배열을 필터링하기
const arr = [
{ num: 1, color: "red" },
{ num: 2, color: "black" },
{ num: 3, color: "blue" },
{ num: 4, color: "green" },
{ num: 5, color: "blue" }
];
console.log(arr.filter((elm)=>elm.color === "blue"));
// (2) [Object, Object] (0: Object 1: Object) ㄴ num: 3 color: "blue"
// 2개의 객체가 출력되었는데 이런 식으로 filter라는 메서드는
// 전달한 콜백함수가 true를 반환하는 모든 요소를 배열로 반환하는 내장함수임
// 📝 slice
// 배열을 싹뚝 자르기
const arr = [
{ num: 1, color: "red" },
{ num: 2, color: "black" },
{ num: 3, color: "blue" },
{ num: 4, color: "green" },
{ num: 5, color: "blue" }
];
console.log(arr.slice((0,2)); // 첫번째 인자 begin, 두번째 인자 end라고 함
// (2) [Object, Object]
// slice 메서드는 end에서 1개를 뺀거까지 반환함. end에 명시된 것은 반환하지 않음
// 따라서 새로운 배열로 0~1까지만 반환
// 📝 concat
// 배열을 붙이기
const arr1 = [
{ num: 1, color: "red" },
{ num: 2, color: "black" },
{ num: 3, color: "blue" }
];
const arr2 = [
{ num: 4, color: "green" },
{ num: 5, color: "blue" }
];
console.log(arr1.concat(arr2));
// (5) [Object, Object, Object, Object, Object]
// arr1과 arr2를 붙여서 새로운 하나의 배열로 반환
// 📝 sort
// 문자형 배열을 정렬하기
let chars = ["나", "다", "가"];
chars.sort(); // 사전 순으로 원본 배열을 정렬함
console.log(chars); // (3) ["가", "나", "다"]
// 📝 비교함수
// 숫자 배열을 정렬하기
let numbers = [0,1,3,2,10,30,20];
// sort는 문자열을 기준으로 정렬함
// 숫자 배열도 정렬하려면 비교함수를 만들어서 넣어준다
// 비교함수는 기본적으로 두개의 값을 비교해서 3가지 중 하나의 값을 내놓아야 함
const compaer = (a,b) => { // a,b를 받았을 때
// 1. 같다
// 2. 크다
// 3. 작다
if (a > b) {
// 2번인 크다 (a가 b보다, 큰 값이 뒤에 있어야 함)
return 1;
}
if (a < b) {
// 3번인 작다 (a가 b보다, 작은 값이 앞에 있어야 함)
return -1;
}
// 1번인 같다 (같을 때는 자리를 안 바꾼다)
return 0;
// 오름차순으로 정렬하게 됨
// 음수와 양수를 바꿔주면 내림차순 가능
}
numbers.sort(compare); // 파라미터로 넣어주고
console.log(numbers);
// (7) [0,1,2,3,10,20,30] 으로 숫자형태로 정렬되어 출력
// 📝 비교함수를 직접 제작해서 sort 메서드에 전달하면
// 객체 배열, 함수 배열, 배열들의 배열도 원하는 대로 정렬할 수 있게 됨
// 📝 join
// 배열 내의 모든 요소를 문자형 형태로 합치기
const arr = ["이정환", "님", "안녕하세요", "또오셨군요"];
console.log(arr[0], arr[1], arr[2], arr[3]); // 이정환 님 안녕하세요 또오셨군요
// 합쳐서 ,로 구분하여 합쳐서 출력
console.log(arr.join()); // 이정환,님,안녕하세요,또오셨군요
// join() 안에 넣는 것으로 구분하여 합쳐서 출력
console.log(arr.join(" ")); // 이정환 님 안녕하세요 또오셨군요
console.log(arr.join("바보");) // 이정환바보님바보안녕하세요바보또오셨군요
안녕하세요 선배님
이정환입니다 😃
모교 선배님을 이렇게 뵐 수 있다니 너무 반갑습니다.
제 강의 추천해주시고 블로그 업로드도 해주셔서 감사합니다!