1. Let과 Var의 차이
: Var의 경우, 동일한 이름으로 변수를 다시 선언할 수 있지만 let과 const는 같은 변수명으로 다시 객체의 재선언이 불가능하다. (let은 값을 바꾸는 재할당은 가능하다.)
2. 형변환
: JS에서는 자동으로 형변환이 이루어지는 경우가 있다. 곱하기 연산(*)의 경우, 숫자형과 문자형을 곱했을 때 문자형을 숫자형으로 변환 가능하다면 자동으로 형변환이 진행되며, 더하기 연산(+)의 경우, 문자형의 더하기 연산으로 간주되어 숫자형을 문자형으로 자동 형변환한다.
그 외에도 의도적으로 형변환을 지정할 경우에는 parseInt(), parseFloat() 등을 사용한다. (parse의 경우 문자열 내에서 숫자만 찾아내 변환한다.)
3. 연산자
자바스크립트에서는 ==와 ===의 동작이 다르다.
기본적으로 우리가 생각하는 Python에서의 ==의 기능을 사용하기 위해서는 === 연산자를 사용해야 한다.
==의 경우 문자형과 숫자형을 비교했을 때, 두 값이 동일하면 자료형이 다르더라도 True를 반환하게 된다.
따라서 Python의 연산자 != 역시 자바스크립트에서는 !==가 된다.
4. 화살표 함수
변수에 함수를 선언하는 익명 함수의 경우, 아래 코드와 같이 단순화 하기도 한다.
console.log(helloB());
// 함수 표현식
let helloA = function () {
return "안녕하세요 여러분";
}
// 화살표 함수
// 한줄일 경우에는 블럭을 제외할 수 있다.
let helloC = () => "안녕하세요 여러분";
let helloD = () => {
return "안녕하세요 여러분";
}
// 함수 선언식
// 선언식은 호이스팅이 적용됨
function helloB () {
return "안녕하세요 여러분";
}
5. 콜백함수
패러미터에 함수를 지정하는 것을 콜백 함수라고 부른다. 아래 코드 참조.
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를 출력
6. 객체
객체는 Non-Primitive Type(비 원시 타입)에 해당한다.
원시타입은 메모리의 값이 수정이 안 되고, 객체타입(비 원시 타입)은 메모리의 값을 수정할 수 있다. 그렇기 때문에 객체에 값을 복사하려면 스프레드 연산자 등을 통해 새로 객체를 만들어줘야 한다.
객체간의 비교는 참조값을 통해 이루어진다. 얕은 복사는 ===를 하면 true가 뜨지만, 깊은 복사는 false가 된다. 참조값을 기준으로 비교하기 때문에 ==도 false가 된다.
만약 두 객체 내부의 값을 비교하고 싶다면 JSON.stringify등의 함수를 써서 비교해줘야 한다.
객체를 생성하는 방법은 아래 코드와 같다.
// 객체 생성자 (new 키워드 사용)
let person1 = new Object();
// 객체 리터럴 방식
let person = {
key: "value", // 프로퍼티 (객체 프로퍼티)
key1: 123,
key2: true,
key3: undefined,
key4: [1, 2]
key5: function() {
console.log(`안녕 나는 ${this.key}`);
}
};
// 객체의 프로퍼티를 중괄호 안에 출력
console.log(person);
// 객체의 프로퍼티에 접근(점 표기법)
console.log(person.key1);
// 괄호 표기법
// 반드시 대괄호 안에는 문자열 형태로 키를 입력할 것
// 대문자 빠지면 변수명으로 인식함
console.log(person["key1"]);
// 점 표기법으로 프로퍼티 추가/수정하기
person.location = "한국";
// 객체 내의 함수 호출 시
person.key5();
person["key5")();
객체 프로퍼티 안에는 다양한 자료형이 들어갈 수 있다. 만약 key명이 동일할 경우, 나중에 선언된 것으로 값이 덮어씌워진다.
만약 객체 내에 존재하지 않는 프로퍼티에 접근할 경우, undefined를 출력한다. 또한 객체 안에 들어있는 함수는 메서드라 부르며, 그 외의 키 값은 전부 멤버라고 부른다.
만약 객체를 선언하는 변수를 let 대신 const로 선언하더라도, 프로퍼티의 변경은 상수 자체의 변경이 아니기 때문에 점 표기법으로 수정이 가능하다. 대신, person에 새로운 객체를 대입 연산자로 할당할 경우에는 const로 상수 선언을 했을 시 오류가 발생한다.
프로퍼티의 삭제는 delete 키워드를 이용한다. (delete 객체이름.프로퍼티; 혹은 delete 객체이름["프로퍼티"]; 의 형태)
그러나 메모리에서 실제로 지워지는 건 아니며, 객체 자체와의 연결이 사라지는 것뿐이다.
따라서 차라리 해당 프로퍼티에 null을 대입하는 것을 추천한다.
아래 코드 참조.
const person = {
name: "B",
age: 25
};
// 객체와의 연결은 끊어지지만 메모리 상에서는 삭제X
delete person.name;
// 메모리상에서도 삭제
person.name = null;
그리고 어떤 프로퍼티가 객체 안에 있는지 확인하는 방법은 아래와 같다.
console.log(`name : ${"name" in person}`); // 있을 경우 true 반환
7. 배열
배열의 생성은 객체와 유사하다. 생성자를 사용하거나, 리터럴을 사용하면 된다.
// 생성자 호출
let arr = new Array();
// 배열 리터럴 사용
let arr = [];
// 어떤 자료형이든 들어감
let arr1 = [1, "2", true, null, undefined, {}, [], function() {}];
배열에 접근하는 방식은 Python과 유사하게 인덱스를 부르는 방법으로 부를 수 있다.
push를 이용하면 배열의 가장 마지막에 원소를 추가할 수 있으며, 자료형은 상관없다. (기존의 원소와 전혀 다른 자료형이어도 추가할 수 있다.)
배열의 길이는 length를 이용해 리턴할 수 있다.
let arr = [1, 2, 3, 4, 5];
// 원소 추가하기
arr.push(6);
console.log(arr); // [1, 2, 3, 4, 5, 6]
// 길이 반환하기
console.log(arr.length);
배열의 내장 함수는 객체의 메서드를 쓰는 것처럼 사용하면 된다.
아래는 내장 함수의 예시다.
const arr = [1, 2, 3, 4];
// 1) forEach
// for문으로 원소를 하나씩 출력하는 것과 동일
// (elm) => console.log(elm) 부분은 콜백 화살표 함수
arr.forEach((elm) => console.log(elm));
// 함수 선언 방식
arr.forEach(function (elm) {
console.log(elm);
});
// 2) map
const newArr = arr.map((elm) => {
return elm * 2;
});
// 함수 선언 방식
arr.forEach(function (elm) {
newArr.push(elm * 2);
});
console.log(newArr);
// 3)includes
// 주어진 배열에서 전달받은 원소를 포함(값, 자료형 동일)하고 있으면 true, 아닐시 false
let number = 3;
console.log(arr.includes(number));
// 함수 선언 방식
arr.forEach((elm) => {
if (elm === number) {
console.log(true);
}
});
// 4) indexOf
// 찾는 게 없을 경우 -1을 반환
console.log(arr.indexOf(number));
const arr1 = [
{ color: "red" },
{ color: "black" },
{ color: "blue" },
{ color: "green" }
];
// 5) findIndex
// 일치하는 요소가 여러 개 있을 경우, 가장 먼저 조건을 만족하는 값을 return
console.log(arr1.findIndex((elm) => elm.color === "green" ));
// 함수 선언 방식
console.log(arr1.findIndex((elm) => {
return elm.color === "red";
}));
// 6) find
// 인덱스가 아닌 조건에 부합하는 값 자체를 가져옴
const element = arr1.find((elm) => {
return elm.color === "blue";
});
console.log(element); //{ color: "blue" } 출력
// 7) filter
const arr2 = [
{ num: 1, color: "red" },
{ num: 2, color: "black" },
{ num: 3, color: "blue" },
{ num: 4, color: "green" },
{ num: 5, color: "blue" },
];
console.log(arr2.filter((elm) => elm.color === "blue"));
// 8) slice
// 슬라이스 하여 배열로 반환
console.log(arr2.slice(0, 2)); // 0부터 1까지 자름 (0(begin) <= 자르는 인덱스 < 2(end))
// 9) concat
// 두 개 합치기
const arr3 = [
{ num: 1, color: "red" },
{ num: 2, color: "black" },
{ num: 3, color: "blue" }
];
const arr4 = [
{ num: 4, color: "green" },
{ num: 5, color: "blue" }
];
// arr3 뒤에 arr4를 붙임
console.log(arr3.concat(arr4));
// 10) sort
let chars = ["나", "다", "가"];
let numbers = [0, 1, 3, 2, 10, 30, 20];
// 오름차순 정렬(원본 배열을 정렬)
chars.sort();
console.log(chars);
// sort는 문자열로 정렬하기 때문에
// 숫자의 크기 순이 아니라 사전순 정렬을 함
numbers.sort();
console.log(numbers);
// 따라서 숫자를 정렬할 경우 비교함수를 작성
const compare = (a, b) => {
if (a > b) {
// 양수일 경우 a를 뒤로 보냄
return 1;
} else if (a < b) {
// 음수일 경우 a를 앞으로 보냄
return -1;
} else {
return 0;
}
}
numbers.sort(compare);
// 11) join
const arr5 = ["복슬복스", "님", "안녕하세요", "또오셨군요"];
// join()의 괄호에 들어가는 건 구분자(보통은 쉼표로 연결해줌)
console.log(arr5.join());
8. 변수의 값에 따른 참과 거짓(Truthy & Falsy)
변수에 0을 제외한 모든 값 및 빈 배열, 빈 객체 등이 들어가면 True, 그 외 ±0이나 NaN, 공백, undefined, null 등은 False로 인식한다. (문자열로 "false"를 넣어도 True로 인식한다.)
const getName = (person) => {
return person.name;
};
let person = { name: "복슬복스" };
// 만약 let person; 으로 undefined를 전달할 경우
// 점 표기법을 사용할 수 없으므로 오류가 발생한다.
const name = getName(person);
console.log(name);
// 개선된 함수
const getNameNoError = (person) => {
// Falsy 속성을 이용하기 (원래는 person === undefined || person === null 사용)
if (!person) {
return "객체가 아닙니다.";
}
return person.name;
}
const real_name = getNameNoError(person);
9. 삼항 연산자
앞으로의 강의
'Javascript' 카테고리의 다른 글
인프런 리액트 강의 - Javascript 요약 ② (1) | 2024.10.28 |
---|---|
Chapter 5 요약 (1) | 2022.09.21 |
Chapter 4 요약 (0) | 2022.09.15 |
Chapter 3 요약 (0) | 2022.09.13 |
Chapter 2 요약 (0) | 2022.09.06 |