no image
[JavaScript] 클래스
이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다. 클래스 기본 형태 다른 프로그래밍 언어와 비슷한 형태이다. private 클래스 내부에서 사용되는 # 기호로 시작하는 이름으로 선언된 멤버가 private 멤버로 취급된다. 이러한 private 멤버는 클래스 외부에서 직접 접근할 수 없다. static JavaScript에서 static 키워드는 클래스의 정적(static) 멤버를 정의할 때 사용된다. 정적 멤버는 클래스 자체에 속하며 인스턴스를 생성하지 않고도 클래스에서 직접 접근할 수 있는 멤버이다. 상속 JavaScript에서 클래스를 정의할 때, extends 키워드를 사용하여 다른 클래스를 상속할 수 있다. 만약 부모 ..
2024.01.18
no image
[JavaScript] 예외처리
이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다. try - catch - finally 문 try{ //예외 발생 가능성이 있는 코드 } catch(exception){ //예외처리를 할 코드 } finally{ //무조건적으로 실행될 코드 } finally 구문은 catch 구문에서 return, break, continue 등을 만나더라도 실행된다. 또한 파일 입출력등에서 파일을 사용 도중에 오류를 만나면 리소스를 자동으로 닫는 상황에서도 사용된다. 예외 객체 예외 객체 속성 속성이름 설명 name 예외 이름 message 예외 메시지 예외 강제 발생 상황에 따라서 예외를 강제로 발생시켜야 하는 경우도 있다. 자바스크립트는..
2024.01.18
no image
[JavaScript] 문서 객체 모델(DOM:Document Object Model)
이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다. 문서 객체 조작 DOMContentLoaded DOMContentLoaded는 웹 페이지의 모든 HTML 요소가 브라우저에 의해 로드되고 파싱되었을 때 발생하는 이벤트이다. 이는 이미지, 스타일시트 등의 외부 자원을 기다리지 않고, HTML 요소들 자체가 다 로드되었을 때 발생한다. 이벤트가 발생하면 JavaScript에서 이를 감지하여 특정 기능을 실행하거나 초기화 작업을 할 수 있다. 페이지의 모든 구성 요소가 준비된 상태에서 JavaScript 코드를 실행할 수 있는 타이밍을 제공하여, 더 나은 사용자 경험을 만들거나 웹 애플리케이션을 초기화하는 데 활용할 수 있다. 문서 ..
2024.01.17
no image
[JavaScript] 객체(Object)
이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다. 객체의 기본 객체 자바스크립트에서 객체는 속성(key-value 쌍)을 포함하는 데이터 구조이다. 객체는 중괄호 {}를 사용하여 만들며, 각 속성은 콜론(:)을 사용하여 키와 값으로 구성된다. // 빈 객체 생성 let person = {}; // 객체에 속성 추가 person.name = "John"; person.age = 30; person.gender = "male"; // 또는 객체 생성과 동시에 속성 정의 let car = { brand: "Toyota", model: "Corolla", year: 2020 }; // 객체의 속성에 접근 console.log(perso..
2024.01.16
no image
[JavaScript] 함수
이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다. 익명 함수 함수에 이름이 없어서 익명함수라고 한다. 일반적으로 함수를 선언할 때 함수명을 지정하지만, 익명 함수는 그렇지 않다. 보통 변수에 할당되거나 다른 함수 내에서 사용되어 일회성으로 실행할 때 유용하게 활용된다. let 익명함수 = function() { console.log("이 함수는 익명 함수입니다."); }; 익명함수() // 익명함수 호출하려면 변수명을 사용 프로시저 함수 프로시저 함수란 특정한 결과를 반환하지 않고 단순히 작업을 수행하는 함수를 가리킨다. 선언적 함수 선언적 함수는 일반적인 함수 선언 방식으로 정의된 함수를 가리킨다. 함수를 선언할 때 사용되는 ..
2024.01.15
no image
[JavaScript] 반복문
이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다. for in 반복문 배열과 함께 사용할 수 있는 반복문은 for in 반복문이다. for in 반복문은 배열 요소의 인덱스를 이용해 특정 문장을 실행할 때 사용한다. for of 반복문 for of 반복문은 배열의 요소 자체를 이용해 특정 문장을 실행할 때 사용한다. for 반복문 다른 프로그래밍 언어에서 사용하는 for문과 똑같다. while, continue, break문은 다른 프로그래밍 언어와 똑같으므로 생략
2024.01.14
no image
[JavaScript] 배열(Array)
이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다. 배열 만들기 배열명 = [요소, 요소, 요소.....] 배열 요소에 접근 배열명[인덱스] 배열 요소 추가 Array.push(요소) : 맨 뒤에 요소 추가 Array.unshift(요소) : 맨 앞에 요소 추가 Array.splice(인덱스, 0, 요소) : 원하는 인덱스에 요소 추가 두 번째 파라미터에 0이 아니라 1이 들어가면 요소 삭제다. 배열 요소 삭제 Array.pop() : 맨 뒤의 요소 삭제 Array.shift() : 맨 앞의 요소 삭제 Array.splice(인덱스, n) : 원하는 인덱스 포함 n개의 요소를 제거 원하는 요소의 인덱스 찾기 indexof(요소) ..
2024.01.14
no image
[JavaScript] 자료형, 상수와 변수, 자료형 변환
이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다. 기본 자료형 자바스크립트에서 가장 기본적이면서도 많이 사용하는 자료형은 아래와 같다. 숫자(number) 문자열(string) 불(bool) 문자열 자료형 문자열을 만들 때는 큰 따옴표를 이용해서 만들 수도 있고, 작은 따옴표를 사용해서 만들 수도 있다. 문자열 연산자 문자열 사이에 덧셈 기호를 사용하면 문자열을 연결할 수 있다. 문자열 내부의 문자 하나를 선택할 때는 문자 선택 연산자를 사용한다. 문자열의 길이도 구할 수 있다. 숫자 자료형 자바스크립트는 소수점이 있는 숫자와 없는 숫자를 모두 같은 자료형으로 인식한다. 숫자를 입력하면 숫자 자료가 만들어진다. 숫자 연산자 등은..
2024.01.13

이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


클래스 기본 형태

다른 프로그래밍 언어와 비슷한 형태이다.

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <script>
      class Student {
        //생성자
        constructor (이름, 국어, 영어, 수학, 과학) {
          this.이름 = 이름
          this.국어 = 국어
          this.영어 = 영어
          this.수학 = 수학
          this.과학 = 과학
        }
		//메소드 -> 메소드는 콜백함수를 사용할 수 없음
        getSum () {
          return this.국어 + this.영어 + this.수학 + this.과학
        }
        getAverage () {
          return this.getSum() / 4
        }
        toString () {
          return `${this.이름}\t${this.getSum()}점\t${this.getAverage()}점\n`
        }
      }
      // 객체를 선언합니다.
      const students = []
      students.push(new Student('구름', 87, 98, 88, 90))
      students.push(new Student('별이', 92, 98, 96, 88))
      students.push(new Student('겨울', 76, 96, 94, 86))
      students.push(new Student('바다', 98, 52, 98, 92))

      //출력합니다.
      let output = '이름\t총점\t평균\n'
      for (const s of students) {
        output += s.toString()
      }
      console.log(output)
    </script>
  </head>
  <body>
  </body>
</html>

 

private

클래스 내부에서 사용되는 # 기호로 시작하는 이름으로 선언된 멤버가 private 멤버로 취급된다.

이러한 private 멤버는 클래스 외부에서 직접 접근할 수 없다.

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <script>
      // 정사각형 클래스
      class Square {
        #length //private 변수

        constructor (length) {
          this.setLength(length)
        }

        setLength (value) { /*setter*/
          if (value <= 0) {
            throw '길이는  0보다 커야 합니다.'
          }
          this.#length = value
        }

        getLength (value) { /*getter*/
          return this.#length
        }
        
        //메소드
        getPerimeter () { return 4 * this.#length }
        getArea () { return this.#length * this.#length }
      }

      // 클래스 사용하기
      const square = new Square(10)
      console.log(`한 변의 길이는 ${square.getLength()}입니다.`)

      // 예외 발생시키기
      square.setLength(-10)
    </script>
  </head>
  <body>
  </body>
</html>

 

static

JavaScript에서 static 키워드는 클래스의 정적(static) 멤버를 정의할 때 사용된다.

정적 멤버는 클래스 자체에 속하며 인스턴스를 생성하지 않고도 클래스에서 직접 접근할 수 있는 멤버이다.

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <script>
      class Square {
        #length
        static #conuter = 0 /*statc 키워드*/
        static get counter () { /*statc 메소드*/
          return Square.#conuter
        }
        constructor (length) { /*생성자*/
          this.length = length
          Square.#conuter += 1
        }

        static perimeterOf (length) {
          return length * 4
        }
        static areaOf (length) {
          return length * length
        }
        
        get length () { return this.#length }
        get perimeter () { return this.#length * 4 }
        get area () { return this.#length * this.#length }

        set length (length) {
          if (length < 10) {
            throw '길이는 0보다 커야 합니다.'
          }
          this.#length = length
        }
      }

      // static 속성 사용하기
      const squareA = new Square(10)
      const squareB = new Square(20)
      const squareC = new Square(30)
      console.log(`지금까지 생성된 Square 인스턴스는 ${Square.counter}개입니다.`)
      // static 메소드 사용하기
      console.log(`한 변의 길이가 20인 정사각형의 둘레는 ${Square.perimeterOf(20)}입니다.`)
      console.log(`한 변의 길이가 30인 정사각형의 둘레는 ${Square.areaOf(30)}입니다.`)
    </script>
  </head>
  <body>
  </body>
</html>

 

상속

JavaScript에서 클래스를 정의할 때, extends 키워드를 사용하여 다른 클래스를 상속할 수 있다.

만약 부모 클래스의 생성자(constructor)가 있는 경우, 하위 클래스(자식 클래스)에서는 super()를 호출하여 부모 클래스의 생성자를 명시적으로 호출해야 한다.

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <script>
      // 사각형 클래스
      class Rectangle {
        constructor (width, height) {
          this.width = width
          this.height = height
        }

        // 사각형의 둘레를 구하는 메소드
        getPerimeter () {
          return 2 * (this.width + this.height)
        }

        // 사각형의 넓이를 구하는 메소드
        getArea () {
          return this.width * this.height
        }
      }

      // 정사각형 클래스
      class Square extends Rectangle {
        constructor (length) {
          super(length, length)
        }

      }

      // 클래스 사용하기
      const square = new Square(10, 20)
      console.log(`정사각형의 둘레: ${square.getPerimeter()}`)
      console.log(`정사각형의 넓이: ${square.getArea()}`)
    </script>
  </head>
  <body>
  </body>
</html>

'JavaScript Category > JavaScript' 카테고리의 다른 글

[JavaScript] 예외처리  (0) 2024.01.18
[JavaScript] 문서 객체 모델(DOM:Document Object Model)  (0) 2024.01.17
[JavaScript] 객체(Object)  (0) 2024.01.16
[JavaScript] 함수  (1) 2024.01.15
[JavaScript] 반복문  (0) 2024.01.14

이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


try - catch - finally 문

try{
      //예외 발생 가능성이 있는 코드
    } catch(exception){
      //예외처리를 할 코드
    } finally{
      //무조건적으로 실행될 코드
    }
finally 구문은 catch 구문에서 return, break, continue 등을 만나더라도 실행된다.
또한 파일 입출력등에서 파일을 사용 도중에 오류를 만나면 리소스를 자동으로 닫는 상황에서도 사용된다.

 

예외 객체

예외 객체 속성

속성이름 설명
name 예외 이름
message 예외 메시지
<!DOCTYPE html>
<html>
<head>
  <title>localStorage에 JSON 데이터 저장하기</title>
  <script>
    try{
      console.rog("Asd") //예외 발생코드
    } catch(exception){
      console.log(exception.name)
      console.log(exception.message)
    } finally{
      //무조건적으로 실행될 코드
    }
  </script>
</head>
<body>
</body>
</html>

 

예외 강제 발생

상황에 따라서 예외를 강제로 발생시켜야 하는 경우도 있다.

자바스크립트는 유연한 언어라서 엄청나게 큰 잘못을 하지 않는이상 예외를 발생시키지 않기 때문에, 프로그램의 안정성을 위해서 예외를 강제로 발생시켜야 하는 경우가 종종 발생한다.

// 단순하게 예외를 발생
throw '예외 내용'

//조금 더 자세하게 예외 발생
throw new Error('예외 내용')

 

function divide(a, b) {
      if (b === 0) {
        throw '나누는 수는 0이 될 수 없습니다.'
      }
      return a / b;
    }
    const result = divide(10, 0);

 

function divide(a, b) {
  if (b === 0) {
    throw new Error('나누는 수는 0이 될 수 없습니다.');
  }
  return a / b;
}

try {
  const result = divide(10, 0);
  console.log('나눈 결과:', result);
} catch (error) {
  console.error('예외 발생:', error.message);
}

 

'JavaScript Category > JavaScript' 카테고리의 다른 글

[JavaScript] 클래스  (0) 2024.01.18
[JavaScript] 문서 객체 모델(DOM:Document Object Model)  (0) 2024.01.17
[JavaScript] 객체(Object)  (0) 2024.01.16
[JavaScript] 함수  (1) 2024.01.15
[JavaScript] 반복문  (0) 2024.01.14

이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


문서 객체 조작

DOMContentLoaded

DOMContentLoaded는 웹 페이지의 모든 HTML 요소가 브라우저에 의해 로드되고 파싱되었을 때 발생하는 이벤트이다.

이는 이미지, 스타일시트 등의 외부 자원을 기다리지 않고, HTML 요소들 자체가 다 로드되었을 때 발생한다.

이벤트가 발생하면 JavaScript에서 이를 감지하여 특정 기능을 실행하거나 초기화 작업을 할 수 있다.

페이지의 모든 구성 요소가 준비된 상태에서 JavaScript 코드를 실행할 수 있는 타이밍을 제공하여, 더 나은 사용자 경험을 만들거나 웹 애플리케이션을 초기화하는 데 활용할 수 있다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <title>transition-timing-function</title>
  <script>
    document.addEventListener('DOMContentLoaded', function() {
      // DOMContentLoaded 이벤트가 발생했을 때 실행할 코드
      console.log('DOM이 완전히 로드되었습니다!');
      
      document.body.innerHTML = '<h1>새로운 제목</h1><p>새로운 문단</p>'
    });
  </script>
</head>
<body>
  <!-- 바디 태그에선 실질적으로 입력한 것이 없음. -->
</body>
</html>

 

문서 객체 가져오기

document.body를 사용하면 문서와 body 요소를 읽어들일 수 있다.

이외에도 HTML 문서에 있는 요소와 title 요소 등은 아래와 같은 방법으로 읽어 들일 수 있다.

  • document.body
  • document.head
  • document.title

 

document.querySelector

body 요소 내부에 만든 다른 요소들은 아래와 같은 다른 별도의 메소드를 사용해서 접근한다.

document.querySelector는 CSS 선택자를 사용하여 문서에서 요소를 선택하는 JavaScript의 메서드이다.

이를 통해 문서 내에서 원하는 요소를 선택하고 조작할 수 있다.

// 클래스가 'example'인 첫 번째 <div> 요소 선택
const element = document.querySelector('div.example');

// id가 'myElement'인 요소 선택
const specificElement = document.querySelector('#myElement');

// <button> 태그 중 첫 번째 요소 선택
const button = document.querySelector('button');

// 속성 선택자를 사용하여 선택
const attributeElement = document.querySelector('[data-id="123"]');

 

<!DOCTYPE html>
<html>
<head>
  <title>querySelector 예시</title>
</head>
<body>
  <h1 id="mainHeading">안녕하세요, 여기는 제목입니다!</h1>
  <h1 id="mainHeading">안녕하세요, 여기는 제목입니다!</h1>

  <script>
    // h1 태그 선택
    const heading = document.querySelector('#mainHeading');

    // 내용 변경
    heading.textContent = '환영합니다!';

    // 스타일 변경
    heading.style.color = 'blue';
    heading.style.fontSize = '28px';
  </script>
</body>
</html>

 

document.querySelectorAll

document.querySelectorAll는 지정된 CSS 선택자에 해당하는 모든 요소를 찾아 NodeList라는 정적인 유사 배열(Collection)로 반환하는 JavaScript의 메서드이다.

// 클래스가 'example'인 모든 <div> 요소들을 선택하여 NodeList로 반환
const elements = document.querySelectorAll('div.example');

// 클래스가 'highlight'인 모든 요소들을 선택하여 NodeList로 반환
const highlightedElements = document.querySelectorAll('.highlight');

// <p> 태그 중 모든 요소들을 선택하여 NodeList로 반환
const paragraphs = document.querySelectorAll('p');

querySelectorAll은 일치하는 모든 요소를 선택하고 NodeList로 반환하기 때문에 forEach나 다른 반복문을 사용하여 NodeList의 각 요소에 접근하고 조작할 수 있다.

// 선택된 모든 <p> 요소의 텍스트 내용을 변경
const paragraphs = document.querySelectorAll('p');
paragraphs.forEach(paragraph => {
  paragraph.textContent = '새로운 내용';
});

 

<!DOCTYPE html>
<html>
<head>
  <title>querySelectorAll 예시</title>
</head>
<body>
  <h1>첫 번째 제목</h1>
  <h1>두 번째 제목</h1>
  <h1>세 번째 제목</h1>

  <script>
    // 모든 h1 태그 선택
    const headings = document.querySelectorAll('h1');

    // 각 h1 태그의 내용 변경
    headings.forEach((heading, index) => {
      heading.textContent = `새로운 제목 ${index + 1}`;
      heading.style.color = 'green';
    });
  </script>
</body>
</html>

 

글자 조작

innerHTMLtextContent는 JavaScript에서 DOM 요소의 내용을 조작하는 데 사용되는 두 가지 속성이다.

보통 텍스트만 변경해야 하는 경우에는 textContent를 사용하고, HTML을 조작해야 하는 경우에는 innerHTML을 사용한다.

그러나 innerHTML을 사용할 때는 새 HTML을 파싱하고 해당 요소의 내용을 완전히 대체하기 때문에, 기존에 연결된 이벤트 핸들러 등이 손실될 수 있다.

// 요소의 HTML 내용을 변경
element.innerHTML = '<p>새로운 HTML</p>';
// 요소의 텍스트 내용을 변경
element.textContent = '새로운 텍스트';

 

<!DOCTYPE html>
<html>
<head>
  <title>innerHTML vs textContent</title>
</head>
<body>
  <div id="exampleInnerHTML">innerHTML 예시</div>
  <div id="exampleTextContent">textContent 예시</div>

  <script>
    const innerHTMLExample = document.getElementById('exampleInnerHTML');
    innerHTMLExample.innerHTML = '새로운 innerHTML 예시';

    const textContentExample = document.getElementById('exampleTextContent');
    textContentExample.textContent = '새로운 textContent 예시';
  </script>
</body>
</html>

 

속성 조작

getAttributesetAttribute는 JavaScript에서 요소의 속성(attribute)을 가져오거나 설정하는 메서드이다.

 

getAttribute: 지정된 요소의 속성 값을 반환합니다. 이를 사용하여 요소의 속성 값을 가져올 수 있다.

// id 속성의 값을 가져옴
const elementId = element.getAttribute('id');

// href 속성의 값을 가져옴
const linkHref = linkElement.getAttribute('href');

 

setAttribute: 지정된 요소에 속성을 설정하거나 새로운 속성을 추가다.

첫 번째 인자로는 설정하려는 속성의 이름을, 두 번째 인자로는 속성의 값을 전달한다.

// id 속성을 설정
element.setAttribute('id', 'newIdValue');

// href 속성을 설정
linkElement.setAttribute('href', 'https://www.example.com');

 

스타일 조작

style 속성은 JavaScript에서 DOM 요소의 인라인 스타일을 직접 조작할 때 사용된다.

이 속성은 해당 요소의 스타일을 동적으로 변경하는 데 유용하다.

CSS와 JavaScript에서 사용되는 스타일 속성 이름은 대부분 유사하지만 몇 가지 주의해야 할 점이 있다.

하이픈(-)을 사용하는 속성 이름: CSS에서 하이픈을 사용하여 표기하는 몇 가지 속성 이름은 JavaScript에서 직접 속성 이름으로 사용할 수 없다. JavaScript에서는 카멜 케이스(camelCase)로 변환하여 사용해야 한다.

  • CSS: font-size
  • JavaScript: fontSize

 

또는 아래와 같이 스타일을 조작할 수 있다.

h1.style['background-color']

 

<!DOCTYPE html>
<html>
<head>
  <title>h1 태그 스타일 조작</title>
</head>
<body>
  <h1 id="mainHeading">안녕하세요, 여기는 제목입니다!</h1>

  <button onclick="changeHeadingStyle()">제목 스타일 변경</button>

  <script>
    function changeHeadingStyle() {
      const heading = document.getElementById('mainHeading');

      // h1 태그의 스타일 변경
      heading.style.color = 'blue';
      heading.style.fontSize = '32px';
      heading.style.fontFamily = 'Arial, sans-serif';
      heading.style.textAlign = 'center';
    }
  </script>
</body>
</html>

 

문서 객체 생성

이벤트 리스너와 이벤트 핸들러는 JavaScript에서 이벤트를 관리하고 처리하는 데 사용되는 용어이다.

  • 이벤트 리스너 (Event Listener): 이벤트 리스너는 특정 이벤트(클릭, 마우스 오버, 키 누름 등)가 발생했을 때 그것을 감지하고, 이에 대응하여 특정한 동작을 수행하는 함수이다.
  • 이벤트 핸들러 (Event Handler): 이벤트 핸들러는 이벤트가 발생했을 때 실행되는 함수를 가리킨다. 이벤트 핸들러는 이벤트 리스너에 등록되어 특정 이벤트가 발생했을 때 실행된다. 이벤트 핸들러는 주로 콜백 함수 형태로 사용된다.
// 버튼 요소 선택
const button = document.getElementById('myButton');

// 이벤트 핸들러 함수
function clickHandler() {
  alert('버튼이 클릭되었습니다!');
}

// 이벤트 리스너 추가
button.addEventListener('click', clickHandler);

문서 객체를 생성하고 싶을 때는 document.createElement()를 이용한다.

document.createElement() 메서드는 새로운 HTML 요소를 생성하는 JavaScript의 기능이다.

이 메서드를 사용하면 스크립트로 새로운 HTML 요소를 동적으로 생성할 수 있다.

// 새로운 button 요소 생성
const newButton = document.createElement('button');

// 버튼에 텍스트 추가
newButton.textContent = '클릭하세요!';

// 버튼에 이벤트 리스너 추가
newButton.addEventListener('click', function() {
  alert('버튼이 클릭되었습니다!');
});

// 버튼을 body에 추가
document.body.appendChild(newButton);

 

appendChild
appendChild는 JavaScript에서 DOM 요소에 자식 요소를 추가하는 메서드이다.
이 메서드를 사용하면 새로운 요소를 기존 요소의 자식으로 추가할 수 있다.
예를 들어, 새로운 <p> 요소를 생성하고 이를 <div> 요소의 자식으로 추가하는 코드는 다음과 같다.
// 새로운 <p> 요소 생성
const newParagraph = document.createElement('p');
newParagraph.textContent = '새로운 문장';

// <div> 요소 선택
const targetDiv = document.getElementById('targetDiv');

// <div> 요소에 새로운 <p> 요소를 자식으로 추가
targetDiv.appendChild(newParagraph);​

 

getElementById()
Document 객체의 메서드로, HTML 문서 내에서 특정 ID를 가진 요소를 가져올 때 사용된다.
이 메서드는 해당 ID를 가진 요소를 반환한다.

 

문서 객체 제거

 

일반적으로 요소를 제거하려면 해당 요소의 부모 요소로부터 제거하는 방식을 사용한다.

parentElement.removeChild(childElement);

또는

// 부모 요소 직접 참조하여 제거
const elementToRemove = document.getElementById('toBeRemoved');
elementToRemove.parentNode.removeChild(elementToRemove);

 

이벤트 설정

// 버튼 요소 선택
const button = document.getElementById('myButton');

// 버튼에 클릭 이벤트 리스너 추가
button.addEventListener('click', function() {
  // 이벤트 발생 시 실행할 코드
  alert('버튼이 클릭되었습니다!');
});

addEventListener는 이벤트 유형(예: 'click', 'mouseover' 등)과 그에 따라 실행될 함수(이벤트 핸들러)를 지정하여 요소에 이벤트를 추가할 수 있다.

이를 통해 사용자의 상호작용에 반응하여 원하는 동작을 수행할 수 있다.

 

이벤트 제거

button.removeEventListener(이벤트 이름, 핸들러 함수);
const button = document.getElementById('myButton');

function clickHandler() {
  alert('버튼이 클릭되었습니다!');
}

// 클릭 이벤트 리스너 추가
button.addEventListener('click', clickHandler);

// 클릭 이벤트 리스너 제거
button.removeEventListener('click', clickHandler);

 

 

이벤트 활용

키보드 이벤트

키보드 이벤트는 아래와 같이 3가지가 있다.

//keydown 이벤트
document.addEventListener('keydown', function(event) {
  console.log('Key pressed:', event.key);
});

//keyup 이벤트
document.addEventListener('keyup', function(event) {
  console.log('Key released:', event.key);
});

//keypress 이벤트
document.addEventListener('keypress', function(event) {
  console.log('Key pressed (keypress):', event.key);
});

keypress 이벤트는 아시아권 문자를 제대로 처리하지 못하는 오류가 있어서 보통 keyup 이벤트를 사용한다.

 

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <script>
      document.addEventListener('DOMContentLoaded', () => {
        const textarea = document.querySelector('textarea')
        const h1 = document.querySelector('h1')

        textarea.addEventListener('keyup', (event) => {
          const length = textarea.value.length
          h1.textContent = `글자 수: ${length}`
        })
      })
    </script>
  </head>
  <body>
    <h1></h1>
    <textarea></textarea>
  </body>
</html>
textarea 등과 같은 텍스트를 입력하는 양식의 값은 value 속성으로 읽어드릴 수 있다.

 

키보드 키코드 사용

키 코드를 이용하여 이벤트 핸들러에서 특정 키를 감지하고 처리할 수 있다.

하지만 주의해야 할 점이 있다.

keyCode는 Deprecated되었고, 대신에 keycode 속성을 사용하는 것이 권장된다.

key는 키의 실제 값(예: 'a', 'Enter', 'Shift' 등)을 나타내고, code는 키보드의 물리적인 위치를 나타내는 값이다.

document.addEventListener('keydown', function(event) {
  // Using key property
  console.log('Key pressed (using key):', event.key);

  // Using code property
  console.log('Key pressed (using code):', event.code);

  // Example: Check if the 'Enter' key is pressed
  if (event.key === 'Enter' || event.code === 'Enter') {
    console.log('Enter key pressed');
  }
});

 

이벤트 발생 객체

이벤트를 발생시킨 객체에 접근하기 위해서는 두 가지 방법이 있다.

  • event.currentTarget
  • this

event.currentTarget를 통해 접근

<!DOCTYPE html>
<html>
<head>
  <title>h1 태그 스타일 조작</title>
  <script>
    document.addEventListener('DOMContentLoaded', () => {
      const textarea = document.querySelector('textarea');
      const h1 = document.querySelector('h1');

      const listener = (event) => {
        const length = event.currentTarget.value.length;
        h1.textContent = `글자 수 ${length}`;
      };

      textarea.addEventListener('keyup', listener);
    });
  </script>
</head>
<body>
  <h1></h1>
  <textarea></textarea>
</body>
</html>

 

 

 

 

this를 통해 접근

<!DOCTYPE html>
<html>
<head>
  <title>h1 태그 스타일 조작</title>
  <script>
    document.addEventListener('DOMContentLoaded', function() {
      const textarea = document.querySelector('textarea');
      const h1 = document.querySelector('h1');

      const listener = function() {
        const length = this.value.length;
        h1.textContent = `글자 수 ${length}`;
      };

      textarea.addEventListener('keyup', listener);
    });
  </script>
</head>
<body>
  <h1></h1>
  <textarea></textarea>
</body>
</html>

 

글자 입력 양식 이벤트

inch를 cm 단위로 변환하는 예제

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <script>
      document.addEventListener('DOMContentLoaded', () => {
        const input = document.querySelector('input')
        const button = document.querySelector('button')
        const p = document.querySelector('p')

        button.addEventListener('click', () => {
          // 입력을 숫자로 변환합니다.
          const inch = Number(input.value)
          // 숫자가 아니라면 바로 리턴합니다.
          if (isNaN(inch)) {
            p.textContent = '숫자를 입력해주세요'
            return
          }
          // 변환해서 출력합니다.
          const cm = inch * 2.54
          p.textContent = `${cm} cm`
        })
      })
    </script>
  </head>
  <body>
    <input type="text"> inch<br>
    <button>계산</button>
    <p></p>
  </body>
</html>

 

이메일 형식 확인 예제

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <script>
      document.addEventListener('DOMContentLoaded', () => {
        const input = document.querySelector('input')
        const p = document.querySelector('p')
        const isEmail = (value) => {
          // 골뱅이를 갖고 있고 && 골뱅이 뒤에 점이 있다면
          return (value.indexOf('@') > 1)
            && (value.split('@')[1].indexOf('.') > 1)
        }

        input.addEventListener('keyup', (event) => {
          const value = event.currentTarget.value
          if (isEmail(value)) {
            p.style.color = 'green'
            p.textContent = `이메일 형식입니다: ${value}`
          } else {
            p.style.color = 'red'
            p.textContent = `이메일 형식이 아닙니다: ${value}`
          }
        })
      })
    </script>
  </head>
  <body>
    <input type="text">
    <p></p>
  </body>
</html>

change 이벤트
input.addEventListener('keyup', (event) => {​
이 코드에서 keyup 대신 change를 사용할 수 있다.
change 이벤트는 사용자가 입력 폼 요소 (주로 <input>, <select>, <textarea>)에서 내용을 변경하고 포커스를 잃었을 때 발생하는 이벤트이다.
이 이벤트는 사용자가 값을 변경하고 입력을 완료하거나 해당 요소를 떠날 때 한 번만 발생한다.

 

드롭다운 목록 활용

기본 select 태그 예제

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <script>
      document.addEventListener('DOMContentLoaded', () => {
        const select = document.querySelector('select')
        const p = document.querySelector('p')

        select.addEventListener('change', (event) => {
          const options = event.currentTarget.options
          const index = event.currentTarget.options.selectedIndex

          p.textContent = `선택: ${options[index].textContent}`
        })
      })
    </script>
  </head>
  <body>
    <select>
      <option>떡볶이</option>
      <option>순대</option>
      <option>오뎅</option>
      <option>튀김</option>
    </select>
    <p>선택: 떡볶이</p>
  </body>
</html>

 

mutiple select 태그

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <script>
      document.addEventListener('DOMContentLoaded', () => {
        const select = document.querySelector('select')
        const p = document.querySelector('p')

        select.addEventListener('change', (event) => {
          const options = event.currentTarget.options
          const list = []
          for (const option of options) {
            if (option.selected) {
              list.push(option.textContent)
            }
          }
          p.textContent = `선택: ${list.join(',')}`
        })
      })
    </script>
  </head>
  <body>
    <select multiple>
      <option>떡볶이</option>
      <option>순대</option>
      <option>오뎅</option>
      <option>튀김</option>
    </select>
    <p></p>
  </body>
</html>

 

cm 단위를 여러 단위로 변환하는 예제

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <script>
      document.addEventListener('DOMContentLoaded', () => {
        let 현재값
        let 변환상수 = 10

        const select = document.querySelector('select')
        const input = document.querySelector('input')
        const span = document.querySelector('span')

        const calculate = () => {
          span.textContent = (현재값 * 변환상수).toFixed(2)
        }

        select.addEventListener('change', (event) => {
          const options = event.currentTarget.options
          const index = event.currentTarget.options.selectedIndex
          변환상수 = Number(options[index].value)
          calculate()
        })

        input.addEventListener('keyup', (event) => {
          현재값 = Number(event.currentTarget.value)
          calculate()
        })
      })
    </script>
  </head>
  <body>
    <input type="text"> cm =
    <span></span>
    <select>
      <option value="10">mm</option>
      <option value="0.01">m</option>
      <option value="0.393701">inch</option>
    </select>
  </body>
</html>

 

체크박스 활용 예제

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <script>
      document.addEventListener('DOMContentLoaded', () => {
        let [timer, timerId] = [0, 0]
        const h1 = document.querySelector('h1')
        const checkbox = document.querySelector('input')

        checkbox.addEventListener('change', (event) => {
          if (event.currentTarget.checked) {
            // 체크 상태
            timerId = setInterval(() => {
              timer += 1
              h1.textContent = `${timer}초`
            }, 1000)
          } else {
            // 체크 해제 상태
            clearInterval(timerId)
          }
        })
      })
    </script>
  </head>
  <body>
    <input type="checkbox">
    <span>타이머 활성화</span>
    <h1></h1>   
  </body>
</html>

 

라디오 버튼 활용 예제

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <script>
      document.addEventListener('DOMContentLoaded', () => {
        // 문서 객체 추출하기
        const output = document.querySelector('#output')
        const radios = document.querySelectorAll('[name=pet]')

        // 모든 라디오 버튼에
        radios.forEach((radio) => {
          // 이벤트 연결
          radio.addEventListener('change', (event) => {
            const current = event.currentTarget
            if (current.checked) {
              output.textContent = `좋아하는 애완동물은 ${current.value}이시군요!`
            }
          })
        })       
      })
    </script>
  </head>
  <body>
    <h3># 좋아하는 애완동물을 선택해주세요</h3>
    <input type="radio" name="pet" value="강아지">
    <span>강아지</span>
    <input type="radio" name="pet" value="고양이">
    <span>고양이</span>
    <input type="radio" name="pet" value="햄스터">
    <span>햄스터</span>
    <input type="radio" name="pet" value="기타">
    <span>기타</span>
    <hr>
    <h3 id="output"></h3>
  </body>
</html>

 

기본 이벤트 막기

웹 브라우저는 마우스 오른쪽 버튼을 클릭하면 컨텍스트 메뉴를 출력한다.

이처럼 어떤 이벤트가 발생했을 때 웹 브라우저가 기본적으로 처리해주는 것을 기본 이벤트라고 부른다.

기본 이벤트를 제거할 때는 event 객체의 preventDefalut() 메소드를 사용한다.

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <script>
      document.addEventListener('DOMContentLoaded', () => {
        const imgs = document.querySelectorAll('img')
       
        imgs.forEach((img) => {
          img.addEventListener('contextmenu', (event) => {
            event.preventDefault()
          })
        })
      })
    </script>
  </head>
  <body>
    <img src="http://placekitten.com/300/300" alt="">
  </body>
</html>

위 코드를 실행하면 고양이 사진이 뜨는데 해당 사진위에서 마우스 우클릭을 하면 컨텍스트 메뉴가 뜨지 않는다.

 

체크할 때만 링크 활성화 예제

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <script>
      document.addEventListener('DOMContentLoaded', () => {
        let status = false
        
        const checkbox = document.querySelector('input')
        checkbox.addEventListener('change', (event) => {
          status = event.currentTarget.checked
        })

        const link = document.querySelector('a')
        link.addEventListener('click', (event) => {
          if (!status) {
            event.preventDefault()
          }
        })
      })
    </script>
  </head>
  <body>
    <input type="checkbox">
    <span>링크 활성화</span>
    <br>
    <a href="http://hanbit.co.kr">한빛미디어</a>
  </body>
</html>

 

할일 목록 만들기

<!DOCTYPE html>
<html>
  <head>
    <title></title>
  </head>
  <body>
    <h1>할 일 목록</h1>
    <input id="todo">
    <button id="add-button">추가하기</button>
    <div id="todo-list">


    </div>
  </body>
  <script>
    document.addEventListener('DOMContentLoaded', () => {
      // 문서 객체를 가져옵니다.
      const input = document.querySelector('#todo')
      const todoList = document.querySelector('#todo-list')
      const addButton = document.querySelector('#add-button')

      // 변수를 선언합니다.
      let keyCount = 0

      // 함수를 선언합니다.
      const addTodo = () => {
        // 입력 양식에 내용이 없으면 추가하지 않습니다.
        if (input.value.trim() === '') {
          alert('할 일을 입력해주세요.')
          return
        }

        // 문서 객체를 설정합니다.
        const item = document.createElement('div')
        const checkbox = document.createElement('input')
        const text = document.createElement('span')
        const button = document.createElement('button')

        // 문서 객체를 식별할 키를 생성합니다.
        const key = keyCount
        keyCount += 1

        // item 객체를 조작하고 추가합니다.
        item.setAttribute('data-key', key)
        item.appendChild(checkbox)
        item.appendChild(text)
        item.appendChild(button)
        todoList.appendChild(item)

        // checkbox 객체를 조작합니다.
        checkbox.type = 'checkbox'
        checkbox.addEventListener('change', (event) => {
          item.style.textDecoration
            = event.target.checked ? 'line-through' : ''
        })

        // text 객체를 조작합니다.
        text.textContent = input.value

        // button 객체를 조작합니다.
        button.textContent = '제거하기'
        button.addEventListener('click', () => {
          removeTodo(key)
        })

        // 입력 양식의 내용을 비웁니다.
        input.value = ''
      }

      const removeTodo = (key) => {
        // 식별 키로 문서 객체를 제거합니다.
        const item = document.querySelector(`[data-key="${key}"]`)
        todoList.removeChild(item)
      }

      // 이벤트 연결
      addButton.addEventListener('click', addTodo)
      input.addEventListener('keyup', (event) => {
        // 입력 양식에서 Enter 키를 누르면 바로 addTodo() 함수를 호출합니다.
        const ENTER = 13
        if (event.keyCode === ENTER) {
          addTodo()
        }
      })
    })
  </script>
</html>

 

localStorage 객체

localStorage 객체는 웹 브라우저의 클라이언트 측에 데이터를 저장하는 데 사용되는 웹 스토리지 객체 중 하나이다. localStorage는 키-값 쌍으로 데이터를 저장하고, 이 데이터는 도메인과 프로토콜에 국한되어 해당 도메인에서만 접근할 수 있다.

저장된 데이터는 사용자의 로컬 브라우저에 영구적으로 보존되며, 동일한 도메인의 모든 페이지에서 공유된다.

  • window 객체의 속성을 통해 localStorage에 접근할 수 있다.
window.localStorage

 

  • setItem(key, value): 지정된 키와 값을 사용하여 데이터를 저장한다. 만약 이미 같은 키가 존재하면 기존 값은 덮어쓴다.
localStorage.setItem('username', 'JohnDoe');

 

  • getItem(key): 지정된 키에 대한 값을 반환한다. 만약 해당 키가 없으면 null을 반환한다.
const username = localStorage.getItem('username');

 

  • removeItem(key): 지정된 키와 관련된 데이터를 삭제한다.
localStorage.removeItem('username');

 

  • clear(): 모든 데이터를 삭제하여 localStorage를 초기화한다.
localStorage.clear();

 

  • key(index): 지정된 인덱스에 해당하는 키를 반한한다. localStorage에 저장된 키의 순서는 추가된 순서를 따른다.
const firstKey = localStorage.key(0);

 

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <script>
      document.addEventListener('DOMContentLoaded', () => {
        const p = document.querySelector('p')
        const input = document.querySelector('input')
        const button = document.querySelector('button')

        const savedValue = localStorage.getItem('input')
        // localStorage.input도 가능합니다.
        if (savedValue) {
          input.value = savedValue
          p.textContent = `이전 실행 때의 마지막 값: ${savedValue}`
        }

        input.addEventListener('keyup', (event) => {
          const value = event.currentTarget.value
          localStorage.setItem('input', value)
          // localStorage.input = value도 가능합니다.
        })

        button.addEventListener('click', (event) => {
          localStorage.clear()
          input.value = ''
        })
      })
    </script>
  </head>
  <body>
    <p></p>
    <button>지우기</button>
    <input type="text">
  </body>
</html>

 

JSON 이용

Storage 타입은 문자열 데이터만 저장한다.

JSON.stringify()JSON.parse()는 각각 JavaScript 객체를 JSON 문자열로 변환하거나, JSON 문자열을 JavaScript 객체로 변환하는 메소드이다.

 

  • JSON.stringify() : 이 메소드는 JavaScript 객체를 JSON 문자열로 변환한다.
const myObject = { key1: 'value1', key2: 'value2' };
const jsonString = JSON.stringify(myObject);
console.log(jsonString); // '{"key1":"value1","key2":"value2"}'

 

  • JSON.parse() : 이 메소드는 JSON 문자열을 JavaScript 객체로 변환한다.
const jsonString = '{"key1":"value1","key2":"value2"}';
const myObject = JSON.parse(jsonString);
console.log(myObject); // { key1: 'value1', key2: 'value2' }

 

storage에서 객체 저장하고 꺼내기

let testObject = { 'one': 1, 'two': 2, 'three': 3 };

//JSON 객체 저장
localStorage.setItem('testObject', JSON.stringify(testObject));

//JSON 객체 불러오기
let retrievedObject = localStorage.getItem('testObject');

console.log('retrievedObject: ', JSON.parse(retrievedObject));

'JavaScript Category > JavaScript' 카테고리의 다른 글

[JavaScript] 클래스  (0) 2024.01.18
[JavaScript] 예외처리  (0) 2024.01.18
[JavaScript] 객체(Object)  (0) 2024.01.16
[JavaScript] 함수  (1) 2024.01.15
[JavaScript] 반복문  (0) 2024.01.14

이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


객체의 기본

객체

자바스크립트에서 객체는 속성(key-value 쌍)을 포함하는 데이터 구조이다.

객체는 중괄호 {}를 사용하여 만들며, 각 속성은 콜론(:)을 사용하여 키와 값으로 구성된다.

// 빈 객체 생성
let person = {};

// 객체에 속성 추가
person.name = "John";
person.age = 30;
person.gender = "male";

// 또는 객체 생성과 동시에 속성 정의
let car = {
    brand: "Toyota",
    model: "Corolla",
    year: 2020
};

// 객체의 속성에 접근
console.log(person.name); // "John"
console.log(car.brand); // "Toyota"

 

속성과 메소드

속성 (Properties)

객체의 속성은 키(key)와 값(value)의 쌍으로 구성된다.

객체의 특정 특징이나 상태를 나타낸다.

예를 들어, name: "John"에서 name은 속성의 키이고 "John"은 해당 속성의 값이다.

let person = {
    name: "John",
    age: 30,
    gender: "male"
};

 

메소드 (Methods)

객체의 메소드는 객체에 속한 함수이다.

이 함수는 해당 객체에서 수행할 수 있는 동작을 정의한다.

예를 들어, 다음과 같이 객체에 메소드를 추가할 수 있다.

let person = {
    name: "Alice",
    greet: function() {
        console.log("Hello, my name is " + this.name);
    }
};

person.greet(); // "Hello, my name is Alice"
this
여기서 this 키워드는 해당 메소드가 속한 객체를 가리킨다.
객체 내에서 다른 속성이나 메소드에 접근할 때 사용된다.

 

 

동적으로 객체 속성 추가/제거

자바스크립트에서 객체는 동적으로 속성을 추가하거나 제거할 수 있다.

이를 통해 객체의 내용을 유연하게 조작할 수 있다.

 

속성 추가

let person = {
    name: "John",
    age: 30
};

// 새로운 속성 추가
person.gender = "male";
person.job = "Engineer";

console.log(person);
// 출력: { name: 'John', age: 30, gender: 'male', job: 'Engineer' }

새로운 속성은 객체의 기존 속성처럼 점 표기법이나 대괄호 표기법을 사용하여 추가할 수 있다.

// 대괄호 표기법으로도 속성 추가 가능
person["location"] = "New York";
console.log(person);
// 출력: { name: 'John', age: 30, gender: 'male', job: 'Engineer', location: 'New York' }

 

속성 제거

let person = {
    name: "John",
    age: 30,
    gender: "male",
    job: "Engineer",
    location: "New York"
};

// 속성 제거
delete person.job;

console.log(person);
// 출력: { name: 'John', age: 30, gender: 'male', location: 'New York' }

 

메소드 간단 선언 구문

자바스크립트에서 메소드를 객체에 추가하는 여러 가지 방법이 있다.

ES6부터는 메소드를 선언하는 간결한 문법이 추가되었다.

// ES6의 간단한 메소드 선언
let obj = {
    // 기존의 함수 선언 방식
    regularMethod: function() {
        console.log("This is a regular method");
    },

    // ES6의 간단한 메소드 선언 방식
    simpleMethod() {
        console.log("This is a simple method");
    }
};

obj.regularMethod(); // 출력: This is a regular method
obj.simpleMethod(); // 출력: This is a simple method

ES6에서는 객체의 메소드를 위한 함수를 선언할 때, function 키워드를 사용하지 않아도 된다.

단순히 메소드 이름과 괄호 ()만으로 메소드를 선언할 수 있다.

이렇게 선언된 메소드는 기존의 함수 선언 방식과 동일한 방식으로 호출될 수 있다.

화살표 함수를 사용한 메소드
화살표 함수(arrow functions)를 사용하여 객체의 메소드를 선언할 수 있다.
하지만 화살표 함수는 자신의 this 를 바인딩하지 않으므로, 객체 내부의 화살표 함수에서는 해당 객체의 컨텍스트를 참조할 수 없다.
따라서 객체의 메소드를 화살표 함수로 선언할 때는 주의해야 한다.
let obj = {
    name: "Bob",
    arrowMethod: () => {
        console.log("Hello, my name is " + this.name); // 여기서 this는 외부의 컨텍스트를 참조하므로 undefined거나 다른 값일 수 있습니다.
    }
};

obj.arrowMethod(); // 출력: Hello, my name is undefined (또는 에러 발생)​

위 예제에서 arrowMethod는 화살표 함수로 정의되었는데, 이 때 this는 외부 컨텍스트를 참조하기 때문에 obj 객체 내부의 name 속성을 제대로 참조하지 못한다.
일반 함수와 달리 화살표 함수 내부에서의 this는 해당 객체를 가리키지 않는다.
따라서 객체의 메소드를 선언할 때, 메소드 내부에서 객체의 속성이나 다른 메소드를 사용해야 한다면 화살표 함수보다는 일반 함수를 사용하는 것이 적절하다.

 

객체의 속성과 메소드 사용

객체 자료형

자바스크립트에서 객체(object)는 기본 자료형(primitive type)이 아닌 참조 자료형(reference type) 중 하나이다.

객체는 여러 속성을 포함하는 컨테이너로, 키(key)와 값(value)의 쌍으로 구성된 속성들의 집합이다.

자바스크립트의 객체는 중괄호 {}를 사용하여 생성하며, 키와 값 사이에 콜론(:)을 사용하여 속성을 정의한다.

let person = {
    name: "John",
    age: 30,
    gender: "male"
};

이 객체는 name, age, gender라는 세 개의 속성을 갖고 있으며, 각 속성은 각각의 값을 가지고 있다.

자바스크립트 객체는 다양한 종류의 데이터를 포함할 수 있습니다.

이러한 객체는 다른 객체나 배열을 포함하여 복잡한 데이터 구조를 만들 수 있습니다.

객체의 속성은 다른 객체, 배열, 함수 등을 값으로 가질 수 있다.

참조 자료형이라 함은, 객체를 변수에 할당할 때 실제 객체 자체가 아니라 메모리상의 위치(참조)가 변수에 저장된다는 것을 의미한다.

이는 객체가 복사되지 않고 참조가 전달되는 방식으로 동작함을 의미한다.

따라서 객체를 복사하거나 전달할 때 실제로는 객체의 참조가 전달된다.

Array.isArray()
배열인지 아닌지를 확인하기 위한 메서드입니다. 이 메서드는 전달된 값이 배열인지 여부를 불리언(boolean)으로 반환합니다.
// 배열인지 여부를 확인할 값
let arr = [1, 2, 3];
let notArr = "This is not an array";

// Array.isArray() 메서드 사용
console.log(Array.isArray(arr)); // true
console.log(Array.isArray(notArr)); // false​

 

일급 객체(first-class object)
함수가 일반 객체와 같은 특성을 갖는다는 것을 의미한다.

 

기본 자료형을 객체로 선언

자바스크립트의 기본 자료형(원시 자료형)은 객체가 아니다.

그러나 원시 자료형을 객체처럼 다룰 수 있도록 자바스크립트는 래퍼(wrapper) 객체를 제공한다.

이러한 래퍼 객체들은 해당 원시 자료형의 값을 감싸고 있는데, 이를 통해 원시 자료형을 마치 객체처럼 다룰 수 있게 된다.

let strPrimitive = "Hello";
let strObject = new String("Hello");

console.log(typeof strPrimitive); // 출력: "string"
console.log(typeof strObject); // 출력: "object"

console.log(strPrimitive.length); // 출력: 5
console.log(strObject.length); // 출력: 5

원시 자료형과 래퍼 객체는 엄연히 다른 것이므로 주의해야 한다.

보통 일반적인 상황에서는 원시 자료형을 사용하는 것이 더 효율적이고 권장한다.

 

기본 자료형의 일시 승급

기본 자료형(primitive types)과 객체(object) 간에 일시적인 변환이 있을 때, 기본 자료형은 객체처럼 동작할 수 있는데 이것을 "일시적 승급" 또는 "자동 박싱(boxing)"이라고 한다.

이러한 변환은 기본 자료형이 마치 객체처럼 동작할 수 있도록 도와준다.

let strPrimitive = "Hello";
console.log(strPrimitive.length); // 출력: 5

let numPrimitive = 10;
console.log(numPrimitive.toFixed(2)); // 출력: 10.00

여기서 strPrimitive은 문자열의 원시 자료형이지만, length 속성에 접근할 수 있다.

마찬가지로 numPrimitive은 숫자의 원시 자료형이지만, toFixed() 메서드를 호출할 수 있다.

이렇게 기본 자료형이 일시적으로 객체로 변환되어 해당 객체의 메서드나 속성을 사용할 수 있다.

이런 변환은 자바스크립트 엔진이 필요에 따라 자동으로 수행된다.

하지만 이 변환은 실제로 새로운 객체를 생성하는 것이 아니라 기본 자료형에 임시적인 래퍼(wrapper) 객체를 생성하여 그 안에서 메서드나 속성을 사용한 후 다시 기본 자료형으로 복귀한다.

 

프로토타입으로 메소드 추가

프로토타입(prototype)을 사용하여 객체의 모든 인스턴스가 공유하는 속성과 메소드를 추가할 수 있다.

프로토타입은 객체의 부모 역할을 하며, 해당 객체에 속성이나 메소드가 없을 때 이를 찾아 올라가며 검색한다.

// 생성자 함수를 통해 프로토타입에 메소드 추가
function Person(name, age) {
    this.name = name;
    this.age = age;
}

// 프로토타입에 메소드 추가
Person.prototype.sayHello = function() {
    console.log("Hello, my name is " + this.name + " and I am " + this.age + " years old.");
};

// 객체 생성
let john = new Person("John", 30);
let alice = new Person("Alice", 25);

// 메소드 호출
john.sayHello(); // 출력: Hello, my name is John and I am 30 years old.
alice.sayHello(); // 출력: Hello, my name is Alice and I am 25 years old.

위의 코드에서 Person 함수의 prototype에 sayHello 메소드를 추가한 것이다.

그 결과, Person 생성자로 만들어진 john과 alice 객체는 sayHello 메소드를 호출할 수 있다.

이러한 방식으로 프로토타입에 메소드를 추가하면 해당 생성자를 사용하여 만든 모든 객체가 그 메소드를 공유하게 된다.

객체 인스턴스는 해당 메소드를 직접 보유하고 있지 않지만 프로토타입 체인을 통해 이를 참조하여 사용할 수 있다.

 

valueOf(), indexOf()

valueOf() 
valueOf() 메서드는 자바스크립트 객체의 원시 값을 반환하는 메서드이다.
이 메서드는 객체를 해당하는 원시 값으로 변환하는 데 사용된다.
주로 객체를 해당하는 원시 값으로 변환해야 하는 경우, 자바스크립트는 내부적으로 valueOf() 메서드를 호출하여 해당 객체를 해당하는 원시 값으로 변환하려고 한다.
valueOf() 메서드를 직접 정의하지 않았을 때, 객체에 대해 valueOf()를 호출하면 객체 자체가 반환된다.
하지만 개발자가 이 메서드를 정의하여 객체의 원시 값을 정확히 반환하도록 제어할 수 있다.
function MyNumber(value) {
    this.value = value;
}

MyNumber.prototype.valueOf = function() {
    return this.value;
};

let num = new MyNumber(42);
console.log(num.valueOf()); // 출력: 42

let primitiveNum = num + 10;
console.log(primitiveNum); // 출력: 52​




indexOf()
배열(Array) 또는 문자열(String)에서 특정 요소나 문자열을 찾아 그 위치(인덱스)를 반환한다.
배열에서는 배열 내 요소의 인덱스를, 문자열에서는 특정 부분 문자열의 시작 위치를 반환한다.
만약 찾는 값이 없으면 -1을 반환한다.
let arr = [1, 2, 3, 4, 5];
console.log(arr.indexOf(3)); // 출력: 2 (3의 인덱스)
console.log(arr.indexOf(10)); // 출력: -1 (10은 배열에 없음)​
let str = "Hello, world!";
console.log(str.indexOf("world")); // 출력: 7 ("world"의 시작 인덱스)
console.log(str.indexOf("JavaScript")); // 출력: -1 ("JavaScript"는 문자열에 없음)

 

Number 객체

toFixed()

toFixed() 메서드는 숫자를 고정 소수점 표기법으로 특정 자릿수까지 반올림하여 문자열로 반환한다.

이 메서드는 소수점 이하의 자릿수를 지정하고 해당 자릿수까지 반올림하여 문자열로 반환한다.

let num = 3.14159;
console.log(num.toFixed(2)); // 출력: "3.14" (소수점 이하 2자리까지 반올림한 문자열)

 

isNaN()

isNaN() 함수는 전달된 값이 NaN (Not-a-Number)인지를 판별하는 메서드이다.

전달된 값이 숫자가 아니거나 숫자로 변환될 수 없는 문자열인 경우 true를 반환하고, 숫자인 경우 false를 반환한다.

console.log(isNaN("Hello")); // 출력: true (숫자로 변환할 수 없는 문자열)
console.log(isNaN(10)); // 출력: false (유효한 숫자)

 

isFinite()

isFinite() 함수는 전달된 값이 유한한(finite) 숫자인지를 판별한다.

전달된 값이 유한한 숫자이면 true를 반환하고, NaN, 무한대(Infinity), 음의 무한대(-Infinity)일 경우에는 false를 반환한다.

console.log(isFinite(10)); // 출력: true (유한한 숫자)
console.log(isFinite(NaN)); // 출력: false (NaN)
console.log(isFinite(Infinity)); // 출력: false (무한대)

 

String 객체

trim()

trim() 메서드는 문자열의 양 끝에서 공백을 제거한 새로운 문자열을 반환한다.

여기서 공백은 공백(space), 탭(tab), 줄 바꿈(newline)과 같은 공백 문자이다.

let str = "   Hello, world!   ";
console.log(str.trim()); // 출력: "Hello, world!" (양 끝의 공백이 제거된 문자열)

 

split()

split() 메서드는 문자열을 특정 구분자(delimiter)를 기준으로 나누어 배열로 반환한다.

구분자는 문자열을 나눌 때 사용되는 문자열 또는 정규 표현식이다.

let str = "apple,banana,grape,orange";
let fruits = str.split(",");
console.log(fruits); // 출력: ["apple", "banana", "grape", "orange"]

 

 

JSON 객체

SON(JavaScript Object Notation)은 데이터를 교환하기 위한 경량의 데이터 형식입니다.

자바스크립트에서 객체를 표현하기 위한 구문을 갖고 있으며, 키-값 쌍의 집합으로 이루어진 데이터를 표현하는 방법이다.

JSON은 텍스트로 이루어져 있으며, 자바스크립트 객체를 직렬화(serialize)하거나 다시 역직렬화(deserialize)하는 데 주로 사용된다.

데이터를 서버와 웹 클라이언트 간에 교환하거나, 다양한 플랫폼 간 데이터를 주고 받을 때 사용된다.

자바스크립트에서 JSON은 JSON 객체를 사용하여 다룰 수 있다.

이 객체는 parse()와 stringify() 메서드를 갖고 있다.

 

JSON.parse()

JSON.parse() 메서드는 JSON 문자열을 파싱하여 자바스크립트 객체로 변환한다.

const jsonString = '{"name": "John", "age": 30}';
const obj = JSON.parse(jsonString);
console.log(obj.name); // 출력: John
console.log(obj.age); // 출력: 30

 

JSON.stringify()

JSON.stringify() 메서드는 자바스크립트 객체를 JSON 문자열로 변환한다.

const obj = { name: "Alice", age: 25 };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // 출력: '{"name":"Alice","age":25}'

 

외부 script 파일 읽어들이기

<script> 태그를 사용하여 외부 스크립트를 HTML 문서에 포함하는 것이다.

이렇게 하면 웹 페이지가 로드될 때 자동으로 스크립트가 읽혀진다.

<!DOCTYPE html>
<html>
<head>
    <title>External Script Loading</title>
    <script src="자바스크립트파일경로"></script>
</head>
<body>
    <!-- 웹 페이지의 내용 -->
</body>
</html>

 

 

객체와 배열 고급

속성 존재 여부 확인

객체에 없는 속성에 접근하면 undefined 자료형이 나온다.

따라서 조건문으로 undefined 인지 아닌지 확인하면 속성 존재 여부를 확인할 수 있다.

let myObj; // 변수를 선언하고 초기화하지 않으면 기본적으로 undefined가 됩니다.

// 객체가 정의되었고, undefined가 아닌지 확인
if (myObj !== undefined) {
    console.log("myObj는 정의되어 있습니다.");
} else {
    console.log("myObj는 정의되어 있지 않거나 undefined입니다.");
}

 

또는 아래와 같은 방법을 사용한다.

  1. object가 정의되어 있고
  2. object의 name 속성이 undefined, null, false, 0, NaN, 혹은 빈 문자열("")이 아닌 다른 값(즉, truthy한 값)을 갖고 있을 때 조건을 충족.
let myObj = {
    name: "John"
};

if (myObj.name) {
    console.log("myObj 객체에 name 속성이 존재하고, 그 값은 truthy한 값입니다.");
} else {
    console.log("myObj 객체에 name 속성이 없거나, 그 값이 falsy한 값입니다.");
}

이 구문은 객체 내에 특정 속성이 존재하고, 그 속성의 값이 truthy한지 확인할 때 유용하다.

그러나 속성이 존재하지 않거나, 해당 속성의 값이 falsy한 값일 경우 조건은 거짓이 된다.

주의할 점은, 속성이 존재하지 않거나 값이 falsy하더라도 예상대로 동작하는지 항상 확인해야 한다.

 

배열 기반의 다중 할당

배열 기반의 다중 할당은 배열의 요소들을 여러 개의 변수에 한 번에 할당하는 것입니다. 배열 구조 분해(destructuring)를 사용하여 배열의 각 요소를 개별 변수로 추출합니다.

const myArray = ['John', 30, 'blue'];

// 배열 기반 다중 할당 (구조 분해)
const [name, age, color] = myArray;

console.log(name); // 출력: "John"
console.log(age); // 출력: 30
console.log(color); // 출력: "blue"
const getDetails = function() {
    return ['John', 30, 'blue'];
};

// 함수의 반환값을 배열 기반 다중 할당으로 추출
const [name, age, color] = getDetails();

console.log(name); // 출력: "John"
console.log(age); // 출력: 30
console.log(color); // 출력: "blue"

 

 

객체 기반의 다중 할당

객체 기반 다중 할당은 ES6의 구조 분해(destructuring) 문법을 사용하여 여러 개의 변수를 한 번에 선언하고 초기화하는 방식입니다. 이를 통해 객체의 속성들을 개별 변수로 추출하여 사용할 수 있습니다.

const myObject = {
    name: 'John',
    age: 30,
    color: 'blue'
};

// 객체 기반 다중 할당 (구조 분해)
const { name, age, color } = myObject;

console.log(name); // 출력: "John"
console.log(age); // 출력: 30
console.log(color); // 출력: "blue"
const myObject = {
    name: 'John',
    age: 30,
    color: 'blue'
};

// 함수 파라미터에서 객체 기반 다중 할당 (구조 분해)
const displayInfo = function({ name, age, color }) {
    console.log(`Name: ${name}, Age: ${age}, Color: ${color}`);
};

displayInfo(myObject); // 출력: "Name: John, Age: 30, Color: blue"

 

배열 전개 연산자

배열 전개 연산자(...)는 배열을 펼쳐서 개별 요소로 분리하거나, 여러 배열을 합치는 데 사용된다.

이 연산자를 사용하면 배열을 풀어내어 개별 요소로 활용할 수 있다.

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

const combinedArray = [...arr1, ...arr2];
console.log(combinedArray); // 출력: [1, 2, 3, 4, 5, 6]
const numbers = [1, 2, 3];

function addNumbers(a, b, c) {
    return a + b + c;
}

const sum = addNumbers(...numbers);
console.log(sum); // 출력: 6

 

배열 전개 연산자를 사용할 때 주의해야 할 점 중 하나는 얕은 복사(shallow copy)이다.

배열 전개 연산자를 사용하여 배열을 복사할 때, 배열 안에 있는 객체들은 참조 값으로 복사된다.

이는 원본 배열과 복사된 배열이 같은 객체를 참조하게 될 수 있다는 것을 의미한다.

const originalArray = [{ name: 'John' }, { name: 'Alice' }];

// 얕은 복사를 통한 배열 전개 연산자 사용
const copiedArray = [...originalArray];

copiedArray[0].name = 'Bob';

console.log(originalArray); // 출력: [ { name: 'Bob' }, { name: 'Alice' } ]
console.log(copiedArray);   // 출력: [ { name: 'Bob' }, { name: 'Alice' } ]

 

이를 방지하기 위해서는 깊은 복사(deep copy)를 수행해야 한다.

이는 배열의 모든 요소와 요소 내부에 있는 객체들까지 별도로 복사하여 새로운 배열을 생성하는 것을 의미한다.

이를 위해서는 반복문이나 다른 방법을 사용하여 객체들을 복사해야 한다.

const originalArray = [{ name: 'John' }, { name: 'Alice' }];
const copiedArray = originalArray.map(obj => ({ ...obj })); // 객체를 새로운 객체로 복사

copiedArray[0].name = 'Bob';

console.log(originalArray); // 출력: [ { name: 'John' }, { name: 'Alice' } ]
console.log(copiedArray);   // 출력: [ { name: 'Bob' }, { name: 'Alice' } ]

 

배열의 요소가 원시값(primitive value)인 경우, 얕은 복사와 깊은 복사의 차이가 드러나지 않습니다. 왜냐하면 원시값은 복사될 때 새로운 값을 생성하기 때문에 원본과는 별도의 값이 됩니다.
const arr = [1, 2, 3];
const newArr = [...arr, 4, 5];
console.log(arr); // 출력: [1, 2, 3]
console.log(newArr); // 출력: [1, 2, 3, 4, 5]​


 

객체 전개 연산자

객체의 속성들을 펼쳐서 새로운 객체로 복사하는 데 사용된다.

이 연산자를 사용하면 기존 객체의 속성들을 가져와서 새로운 객체에 복사할 수 있다.

const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };

const mergedObject = { ...obj1, ...obj2 };

console.log(mergedObject); // 출력: { a: 1, b: 2, c: 3, d: 4 }

객체 전개 연산자에서도 얕은 복사와 깊은 복사를 유의해서 사용해야한다.

 

 

기본 속성 지정

const test = function(object){
  	return `${object.name} , ${object.age}, ${object.color}, ${object.status}`
}

위와 같은 코드에서 기본 매개변수를 지정하는 방법은 아래와 같이 5개의 방법이 있다.

 

구 문법 1

const test = function(object) {
    object.status = object.status !== undefined ? object.status : '이상 없음';
    return `${object.name}, ${object.age}, ${object.color}, ${object.status}`;
};

const myObject = {
    name: 'John',
    age: 30,
    color: 'blue'
};

console.log(test(myObject)); // 출력: "John, 30, blue, 이상 없음"

 

구 문법2

  • object.status가 truthy한 값일 경우(즉, 존재하고 undefined, null, false, 0, NaN, 빈 문자열이 아닌 값인 경우) object.status를 그대로 사용.
  • 그렇지 않을 경우(즉, undefined, null, false, 0, NaN, 빈 문자열인 경우) 기본값으로 '이상 없음'을 사용
const test = function(object) {
    object.status = object.status ? object.status : '이상 없음';
    return `${object.name}, ${object.age}, ${object.color}, ${object.status}`;
};

const myObject = {
    name: 'John',
    age: 30,
    color: 'blue'
};

console.log(test(myObject)); // 출력: "John, 30, blue, 이상 없음"

 

구 문법3

  • object.status가 truthy한 값일 경우(즉, 존재하고 undefined, null, false, 0, NaN, 빈 문자열이 아닌 값인 경우) object.status를 그대로 사용.
  • 그렇지 않을 경우(즉, undefined, null, false, 0, NaN, 빈 문자열인 경우) 기본값으로 '이상 없음'을 사용
const test = function(object) {
    object.status = object.status || '이상 없음';
    return `${object.name}, ${object.age}, ${object.color}, ${object.status}`;
};

 

현대 문법1

...object는 전달된 object의 속성들을 모두 펼쳐서 새로운 객체에 추가하는 것을 의미한다.

이 과정에서 status 속성이 이미 존재하는 경우에는 기존의 status 값을 유지하고, 존재하지 않는 경우에만 '이상 없음'을 기본값으로 설정

그 후에는 새롭게 구성된 objectname, age, color, 그리고 status 속성 값을 사용하여 반환 문자열을 생성

const test = function(object) {
    object = { status: '이상 없음', ...object };
    return `${object.name}, ${object.age}, ${object.color}, ${object.status}`;
};

또는

const test = function(object) {
    const { name, age, color, status } = { status: '이상 없음', ...object };
    return `${name}, ${age}, ${color}, ${status}`;
};

 

 

현대 문법2

fun = function ({name, age, color, status = '이상 없음'}){
    return `${name} , ${age}, ${color}, ${status}`;
};

console.log(fun({
	name: 'John',
    age: 30,
    color: 'blue'
})); // 출력: "John , 30, blue, 이상 없음"

'JavaScript Category > JavaScript' 카테고리의 다른 글

[JavaScript] 예외처리  (0) 2024.01.18
[JavaScript] 문서 객체 모델(DOM:Document Object Model)  (0) 2024.01.17
[JavaScript] 함수  (1) 2024.01.15
[JavaScript] 반복문  (0) 2024.01.14
[JavaScript] 배열(Array)  (0) 2024.01.14

이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


익명 함수

함수에 이름이 없어서 익명함수라고 한다.

일반적으로 함수를 선언할 때 함수명을 지정하지만, 익명 함수는 그렇지 않다.

보통 변수에 할당되거나 다른 함수 내에서 사용되어 일회성으로 실행할 때 유용하게 활용된다.

let 익명함수 = function() {
    console.log("이 함수는 익명 함수입니다.");
};

익명함수() // 익명함수 호출하려면 변수명을 사용
프로시저 함수
프로시저 함수란 특정한 결과를 반환하지 않고 단순히 작업을 수행하는 함수를 가리킨다.

 

선언적 함수

선언적 함수는 일반적인 함수 선언 방식으로 정의된 함수를 가리킨다.

함수를 선언할 때 사용되는 표준적인 방법이며, 함수 이름을 사용하여 함수를 선언하고, 필요한 경우 매개변수를 지정하고 함수 내용을 구현한다.

function add(a, b) {
    return a + b;
}

add(3, 4) // 함수 호출

 

매개변수

나머지 매개변수(가변 매개변수)

function func1(...etc){
	let sum = 0;
	for(const i of etc){
  	sum += i;
  }
  return sum;
}
  
console.log(func1(1,2,3,4,5,6,7,8,9,10)) //etc[] = 1~10
전개 연산자
자바스크립트는 배열을 전개해서 함수의 매개변수로 전달해주는 전개 연산자를 제공한다.
함수명(...배열)​
전개 연산자를 사용하면 함수 파라미터에 배열값을 전달할 때 함수명(arr[1], arr[2]...) 이런식으로 전달할 필요가 없어진다.

 

일반 매개변수와 나머지 매개변수 조합

function func2(a, b, ...etc) {
    let sum = 0;
    sum += a;
    sum += b;
    for(const i of etc){
      sum += i;
  }
  return sum;
}

console.log(func2(1,2,3,4,5,6,7,8,9,10)) //a = 1, b = 2, etc[] = 3~10

 

기본 매개변수

function func3(a, b, c = 3){
    return a + b + c
  }
  console.log(func3(1, 2)); // 1 + 2 + 3 = 6, c에 매개값이 안들어오면 기본으로 3이 됌

 

 

콜백 함수

callThreeTimes(print)로 콜백함수를 호출하면, callThreeTimes()의 매개변수에 print() 함수가 전달된다.

callThreeTimes() 내부의 for문에서 callThreeTimes()의 매개변수로 들어온 함수가 호출된다.

즉, 매개변수로 들어온 print() 함수가 호출된다.

 

콜백 함수를 활용하는 함수

  • forEach() : forEach()메서드는 주어진 함수를 한번씩 각각의 array 요소들에게 실행한다.
  • map() : 배열(array)내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 가진 새로운 배열을 만들어낸다.
  • filter() : 주어진 function에 속한 조건을 통과한 요소들을 새로운 배열로 반환한다.

 

forEach()

let 배열 = [1, 2, 3, 4, 5];

배열.forEach(function(요소) {
  console.log(요소);
});

 

let 배열 = ['사과', '바나나', '딸기'];

배열.forEach(function(요소, 인덱스) {
  console.log(`인덱스 ${인덱스}: ${요소}`);
});

 

map()

let 숫자들 = [1, 2, 3, 4, 5];

let 제곱된숫자들 = 숫자들.map(function(요소) {
    return 요소 * 요소;
});

console.log(제곱된숫자들); // [1, 4, 9, 16, 25]

 

filter()

let 숫자들 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

let 짝수들 = 숫자들.filter(function(요소) {
    return 요소 % 2 === 0;
});

console.log(짝수들); // [2, 4, 6, 8, 10]

 

화살표 함수(=>)

콜백 함수를 쉽게 입력하고자 화살표 함수라는 함수 생성 방법이 있다.

화살표 함수는 function 키워드 대신 => 를 사용한다.

 

forEach()

let 숫자들 = [1, 2, 3, 4, 5];

숫자들.forEach(요소 => {
    console.log(요소);
});

 

map()

let 숫자들 = [1, 2, 3, 4, 5];

let 제곱된숫자들 = 숫자들.map(요소 => {
    return 요소 * 요소;
});

console.log(제곱된숫자들);

 

filter()

let 숫자들 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

let 짝수들 = 숫자들.filter(요소 => {
    return 요소 % 2 === 0;
});

console.log(짝수들);

 

 

타이머 함수

특정 시간마다 또는 특정 시간 이후에 콜백 함수를 호출할 수 있는 타이머 함수들이 있다.

함수 이름 설명
setTimeout(함수, 시간) 특정 시간 후에 함수를 한 번 호출
setInterval(함수, 시간) 특정 시간마다 함수를 호출

 

setTimeout()

setTimeout(function() {
    console.log("일정 시간 후에 실행됩니다.");
}, 3000); // 3초 후에 실행됩니다.

clearTimeout(timeoutId); // setTimeout()이 취소되어 실행되지 않습니다.

 

setInterval()

let intervalId = setInterval(function() {
    console.log("일정 시간마다 실행됩니다.");
}, 2000); // 2초마다 실행됩니다.

clearInterval(intervalId); //intervalId 취소

 

 

즉시 호출 함수

함수를 선언하자마자 즉시 실행되는 함수이다.

(function() {
    // 여기에 코드 작성
})();

 

(function() {
    let 내부변수 = '비공개';

    function 내부함수() {
        console.log(내부변수);
    }

    내부함수(); // 내부함수는 내부변수에 접근할 수 있습니다.
})();

console.log(내부변수); // 오류! 내부변수는 IIFE 외부에서 접근할 수 없습니다.

 

엄격모드

엄격 모드(strict mode)는 JavaScript 코드를 더 엄격하게 해석하여 오류를 줄이고 코드 품질을 향상시키는 모드이다.

이 모드를 사용하면 일부 예상치 못한 동작을 방지하고 코드를 더 예측 가능하게 만든다.

엄격 모드를 활성화하는 방법은 코드의 최상단에 'use strict'; 를 추가하는 것이다.

<script>
    (function() {
      'use strict'
      //코드 작성
    })();
</script>
const 나 let을 생략해도 상수나 변수 같은 것들을 사용 가능한데, 이는 많은 위험을 내포하고 있기 때문에 엄격모드가 생겼다.

이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


for in 반복문

배열과 함께 사용할 수 있는 반복문은 for in 반복문이다.

for in 반복문은 배열 요소의 인덱스를 이용해 특정 문장을 실행할 때 사용한다.

 

for of 반복문

for of 반복문은 배열의 요소 자체를 이용해 특정 문장을 실행할 때 사용한다.

 

for 반복문

다른 프로그래밍 언어에서 사용하는 for문과 똑같다.

 

while, continue, break문은 다른 프로그래밍 언어와 똑같으므로 생략

이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


배열 만들기

  • 배열명 = [요소, 요소, 요소.....]

 

배열 요소에 접근

  • 배열명[인덱스]

 

배열 요소 추가

  • Array.push(요소) : 맨 뒤에 요소 추가
  • Array.unshift(요소) : 맨 앞에 요소 추가
  • Array.splice(인덱스, 0, 요소) : 원하는 인덱스에 요소 추가
    두 번째 파라미터에 0이 아니라 1이 들어가면 요소 삭제다.

 

배열 요소 삭제

  • Array.pop() : 맨 뒤의 요소 삭제
  • Array.shift() : 맨 앞의 요소 삭제
  • Array.splice(인덱스, n) : 원하는 인덱스 포함 n개의 요소를 제거

원하는 요소의 인덱스 찾기
indexof(요소) 메소드를 사용하면 원하는 요소의 인덱스를 리턴한다.
배열 내부에서 특정한 조건을 만족하는 요소 찾기
filter() 배열 내에서 조건에 만족하는 요소를 리턴한다.


아래의 코드는 배열 내에서 3 이상의 요소를 리턴한다.
자료의 비파괴와 파괴

비파괴적 처리 : 처리 후에 원본 내용이 변경되지 않음
파괴적 처리 : 처리 후에 원본 내용이 변경

상수로 선언된 배열이 어떻게 변경이 가능한가?
const에 배열을 할당하면 스택 영역에 힙 영역에 있는 해당 배열의 주소가 매핑된다.
따라서 const로 선언되었더라도 스택 영역에 있는 힙 영역 주소가 바뀌지 않는 한, 힙 영역에 있는 배열이 변경되어도 된다.

이 글은 혼자공부하는 자바스크립트(저자 : 윤인성)의 책 내용과 유튜브 동영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


기본 자료형

자바스크립트에서 가장 기본적이면서도 많이 사용하는 자료형은 아래와 같다.

  • 숫자(number)
  • 문자열(string)
  • 불(bool)

 

문자열 자료형

문자열을 만들 때는 큰 따옴표를 이용해서 만들 수도 있고, 작은 따옴표를 사용해서 만들 수도 있다.

 

문자열 연산자

문자열 사이에 덧셈 기호를 사용하면 문자열을 연결할 수 있다.

 

문자열 내부의 문자 하나를 선택할 때는 문자 선택 연산자를 사용한다.

 

문자열의 길이도 구할 수 있다.

 

 

숫자 자료형

자바스크립트는 소수점이 있는 숫자와 없는 숫자를 모두 같은 자료형으로 인식한다.

숫자를 입력하면 숫자 자료가 만들어진다.

 

숫자 연산자 등은 다른 프로그래밍 언어와 유사하므로 정리는 pass

 

Bool 자료형

자바스크립트에서 비교 연산자는 다른 프로그래밍 언어와 조금 다르다.

연산자 설명
=== 양쪽이 같다.
!== 양쪽이 다르다
> 왼쪽이 더 크다.
< 오른쪽이 더 크다.
>= 왼쪽이 더 크거나 같다.
<= 오른쪽이 더 크거나 같다.
== 연산자와 != 연산자
=== 연산자와 !== 연산자는 값과 자료형이 같은지를 비교하는 연산자이다.
== 연산자와 != 연산자는 값이 같은지를 비교하는 연산자이다.
이러한 차이점 때문에 아래와 같은 차이를 만들게 된다.
===와 !==는 다른 자료형끼리 연산되는 경우를 배제할 때 쓰인다.

논리연산자 또한 다른 언어와 똑같으므로 정리는 pass

 

자료형 검사

자바스크립트에서 자료형을 확인할 때는 typeof 연산자를 사용한다.

해당 연산자는 피연산자를 1개만 갖는 단항 연산자이다.

 

typeof 연산자 뒤에 괄호가 없어도 상관 없다.

 

템플릿 문자열

템플릿 문자열은 백틱(`) 기호로 감싸 만든다.

문자열 내부에 ${...} 기호를 사용하여 표현식을 넣으면 표현식이 문자열 안에서 계산한다.

<script>
  console.log(`5 + 3의 값은 ${5 + 3} 입니다.`)
</script>

 

 

상수와 변수

자바스크립트는 변수보다 상수를 사용하는 것이 효율 측면에서 좋다고 한다.
그래서 다른 프로그래밍 언어에서는 기본적으로 변수를 사용하고 특정한 경우에만 상수를 사용했는데, 자바스크립트는 기본적으로 상수를 사용하고, 값의 변경이 있을 경우에만 변수를 사용한다고 한다.

 

상수

상수는 항상 같은 수 라는의미이고 한 번 값을 할당하면 수정할 수 없다.

상수는 const 키워드를 이용해서 선언할 수 있다.

  • 상수는 선언할 때 값을 할당해야 한다.
  • 상수는 선언할 때 값이 부여되면 이후에 값을 수정할 수 없다.

 

 

변수

변수는 상수와 다르게 언제든지 값을 수정할 수 있다.

변수를 만들 때는 let 키워드를 사용한다.

var
예전에는 let 대신에 var라는 키워드로 변수를 만들었다.
var 키워드는 변수를 중복해서 선언할 수 있다는 위험성, 변수가 속하는 범위가 애매하다는 이유로 현재 쓰이지 않는다.

 

undefined 자료형

상수와 변수로 선언하지 않은 식별자 또는 값이 없는 변수는 모두 undefined 자료형이다.

 

 

자료형 변환

문자열 입력

문자열 자료형을 입력할 때 사용하는 함수는 prompt()이다.

prompt() 로 받는 값들은 모두 string 타입이다.

즉, prompt() 함수는 텍스트박스에 입력되는 내용을 string 타입으로 리턴한다

<script>
  prompt("안내 문자열", "기본적으로 들어가는 문자열")
 </script>

 

<script>
	const a = Number(prompt("첫 번째 피연산자를 입력하세요"))
	const b = Number(prompt("두 번째 피연산자를 입력하세요"))
	alert(`두 피연산자의 덧셈 값은 ${a + b} 입니다.`)
</script>

 

 

Yes or No 입력

메시지 창에서 할거냐 말거의 답변을 얻을려면 confirm() 함수를 사용한다.

리턴 값은 확인을 누르면 true, 취소 값이 누르면 false가 리턴된다.

<script>
 confirm("이게 맞아요?")
</script>

 

자료형 변환

prompt()로 값을 받거나 자료형 변환이 필요할 때는 아래의 함수를 사용한다.

  • Number() - 숫자 자료형으로 변환
  • String() - 문자열 자료형으로 변환
  • Boolean() - bool 자료형으로 변환

 

'JavaScript Category > JavaScript' 카테고리의 다른 글

[JavaScript] 객체(Object)  (0) 2024.01.16
[JavaScript] 함수  (1) 2024.01.15
[JavaScript] 반복문  (0) 2024.01.14
[JavaScript] 배열(Array)  (0) 2024.01.14
[JavaScript] JavaScript에서 알아두어야 할 기본 용어  (1) 2024.01.12