1. 웹 프레임워크의 일종이다. (프레임워크란 어떠한 틀 안에서 정해진 규칙에 따라 작업을 하는 것이다. 작업자에게 여러 가지를 제공하여 개발에 편의를 더해준다.)

 

2. 웹 서비스를 구성하기 위한 필수 구조 요소를 빠르게 제작 가능하다.

 

3. HTTP요청, 응답, HTML 템플릿 엔진, MVC 구조 제공

 

4. 프로젝트 구조를 설계하고 구성하는 것에 대한 부담을 줄이고 기능 개발에 집중을 할 수 있도록 도와준다. 

 

5. Express.js 생성

  • 아래의 명령어를 차례로 입력하여 express의 기본 구조를 형성한다.
  • npm install express-generator -g
  • express 7view=ejs myapp -> myapp의 이름은 원하는대로 설정하면 된다.
  • cd myapp
  • npm install
  • npm start

생성된 디렉토리 구조

 

6. 라우팅

  • HTTP 요청에 따라 알맞은 응답을 보내주는 경로를 설정해주는 일
  • router를 만들고 module.exports하는 것을 까먹지 말자

 

7. middleware

  • 미들웨어는 생각보다 복잡한 개념이 아니다. 요청에 대한 처리를 하는 함수를 의미한다.
  • app객체에서 app.use(middleware)로 사용하면 된다.
  • (req, res, next) => middleware가 가지는 인수이다.
  • (err, req, res, next) => 오류처리를 하는 middleware이다. 다른 middleware에서 next()안에 인자가 담겨오면 곧장 오류처리 middleware로 이동하여 로직이 처리된다. 

'Node.js' 카테고리의 다른 글

Node.js(3) - Module  (0) 2022.05.09
Node.js(2) - NPM  (0) 2022.05.09
Node.js(1) - Introduction  (0) 2022.05.09

1. Module의 기본 개념

1. 반복되는 코드를 따로 분리하여 하나의 파일로 작성하여 모듈화 하는 것이다.

 

2. npm package들이 모듈로 형성되어 있다.

 

3. 프로젝트가 커질 수록 반복되는 코드의 사용을 효율적으로 관리 가능 하게 한다.

 

4. ES6의 import, export문법과 유사한 사용법을 가지고 있다. 

 

2. 사용법

-cal.js

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

const sub = (a, b) => {
    return a - b;
}

const mul = (a, b) => {
    return a * b;
}

module.exports.add1 = add; //add함수를 모듈로 빼는데 그것을 add1라는 이름으로 뺀다.
module.exports.mul = mul;
module.exports.sub = sub;
module.exports = {
    add1: add,
    sub: sub,
    mul: mul
}
  • module을 내보낼때는 위와 같은 방식으로 내보낼 수 있다. 객체의 속성 형태로 내보내거나 혹은 객체의 key-value형태로 내보낼 수 있다.

 

-app.js

const cal = require("./cal"); //우리가 가져온 모듈을 cal이라는 객체로 할당하겠다!
console.log(cal.add1(5, 3));
console.log(cal.sub(5, 3));
console.log(cal.mul(5, 3));
  • module을 사용할 파일에 와서 require를 이용해 module의 경로를 삽입하여 가져온다.

'Node.js' 카테고리의 다른 글

Node.js(4) - Express.js  (0) 2022.05.09
Node.js(2) - NPM  (0) 2022.05.09
Node.js(1) - Introduction  (0) 2022.05.09

1. NPM이란?

1. Node Package Manager의 약자로 Node.js 프로젝트를 관리하는 필수적인 도구이다.

 

2. 이것은 온라인 저장소와 커맨드 라인 툴로 구성되어 있다.

  • 온라인  저장소: Node.js 개발을 위한 오픈소스 package(라이브러리) 저장소이다. 필요한 라이브러리를 검색, 설치 및 활용을 할 수 있다.
  • 커맨드 라인 툴: 프로젝트 관리를 위한 다양한 명령어를 제공한다.
    1. 저장소에서 라이브러리, 도구 설치
    2. 프로젝트 설정 관리
    3. 프로젝트 의존성 관리

3. npm 대표 명령어

명령어 npm init 프로젝트 생성(초기화)
npm install package 설치(의존성 추가)
npm remove package 삭제
npm start 프로젝트(스크립트) 실행
파일/디렉토리 node_modules 프로젝트 package 저장
package.json 프로젝트 관리(dependency 버전 등)
package-lock.json package(의존성, dependency, 관리)
의존성 버전 고정 역할담당

 

'Node.js' 카테고리의 다른 글

Node.js(4) - Express.js  (0) 2022.05.09
Node.js(3) - Module  (0) 2022.05.09
Node.js(1) - Introduction  (0) 2022.05.09

1. Node.js의 탄생

Browser에서 JavaScript코드가 실행할 수 있게 해주는 V8엔진이 있다면 Node.js는 Browser가 아닌 외부 환경에서도 JavaScript코드가 실행 가능하게 해주는 실행기이다.

 

2. Node.js의 특징

node.js의 특징을 한 줄로 요약한다면 싱글 스레드 - 비동기 - 이벤트 기반이라고 할 수 있다.

 

1. Thread란?

  • 명령을 실행하는 단위이다.
  • 한 개의 스레드는 한 번에 한 가지 동작만 실행 가능하다.

2. 비동기란?

  • 동작을 실행한 후 완료가 되길 기다리지 않는 방식이다.
  • 즉 동작을 실행시키는 데만 집중을 하고 완료에는 신경을 쓰지 않는다. 

3. 이벤트 기반이란?

  • 비동기 동작의 완료를 처리하는 방법이다.
  • 비동기 동작은 해당 동작을 실행 후 그 이후는 전혀 신경을 쓰지 않는다. 대신 해당 동작이 완료될 경우 실행할 함수를 미리 등록하여 비동기 동작이 완료되면 미리 등록된 함수가 실행된다.

4. 정리

  • 싱글 스레드 기반이기 때문에 멀티 스레드와 달리 JavaScript코드를 한 번에 한 가지 동작밖에 하지 못한다.
  • 그렇기 때문에 여러 동작을 처리하기 위해 비동기 동작이 필요하다.
  • 비동기 동작의 처리는 위해서 이벤트 기반으로 동작을 하게 된다.

 

3. Node.js의 구성

1. Browser에서 JavaScript코드를 실행 가능하게 해주는 V8엔진을 가져왔다.

2. 이벤트 루프의 일종인 libuv가 있다.

3. Browser에서 Web API역할을 하는 Node.js 기본 라이브러리들이 있다. 

'Node.js' 카테고리의 다른 글

Node.js(4) - Express.js  (0) 2022.05.09
Node.js(3) - Module  (0) 2022.05.09
Node.js(2) - NPM  (0) 2022.05.09

1. async/await

1. async/await은 Promise객체의 then, catch 체이닝 방식을 조금 더 직관적으로 보이도록 하기 위해 나온 문법이다.

 

2. async/await

  • 함수 앞에 async를 붙이면 그 함수의 return값은 항상 promise이다.
  • await은 async함수 안에서만 쓰일 수 있다. 
  • await의 의미는 비동기 코드가 수행이 완료될 때까지 기다린다는 의미이다.
  • Promise로 받은 반환 값을 async함수 외부에서는 다시 then 체이닝 방식으로 활용 가능하다.
  • async/await 방식은 내부에서 try-catch구문으로 에러를 잡아낼 수 있다.

3. Promise의 then 체이닝

fetch('url')
    .then(res => res.json())
    .then(data => console.log(data))

4. async/await 방식

async function aFunc(url) {
    const res = await fetch('url')
    const data = await res.json();
    console.log(data);
}

 

5. async/await의 비동기 처리 과정

출처 : ✨♻️ JavaScript Visualized: Event Loop

'JavaScript' 카테고리의 다른 글

JavaScript(5) - promise  (0) 2022.05.03
JavaScript(4) - JavaScript의 비동기처리  (0) 2022.05.03
JavaScript(3) - 실행 컨텍스트  (0) 2022.05.02
JavaScript(2) - 20220425  (0) 2022.04.25
JavaScript(1) - 20220419  (0) 2022.04.19

1.Promise

1. Promise란?

  • 비동기 작업을 표현하는 JavaScript객체이다.
  • 비동기 작업이 시작되면 pending 즉, 진행상태에 접어든다.
  • 작업이 성공하면 fulfilled 즉, 이행상태 혹은 완료상태를 의미한다.
  • 작업이 실패하면 rejected 즉, 거절상태 혹은 실패상태를 의미한다.

2. practice

function test1() {
    return new Promise((resolve, reject) => {
        let flag = true;
        if(flag) {
            resolve("success");
        } else {
            reject("fail");
        }
    })
}

console.log("start")
test1()
    .then(res => console.log(res))
    .catch(err => console.log(err))
console.log("end")

//start
//end
//success
  • test1()의 실행결과 반환값은 Promise객체이다.  
  • Promise객체의 callback함수의 인자로 resolve와 reject를 전달받는다. 
  • callback 처리 결과에 따라 resolve혹은 reject값을 반환시킨다.
  • resolve값은 처리 결과의 성공을 의미하며 then(callback) 구문을 사용해 resolve의 값을 받아 사용한다.
  • reject값은 처리 결과의 실패를 의미하며 catch(callback) 구문을 사용해 reject의 값을 받아 에러를 표시한다.
  • 코드를 부연 설명
    1. 첫번째 console.log()가 callstack으로 들어가 실행된다
    2. test1()이 실행되고 resolve 혹은 reject상태를 받아온 상태에서 then구문이 실행되고 곧바로 microqueue로 이동한다.
    3. 뒤이어 두번째 console.log()가 callstack으로 들어가 실행된다.
    4. 모두 비워진 callstack에 microqueue에 있던 then구문이 실행되고 resolve결과 값이 console에 찍힌다. 

 

2. 비동기 처리에서 Queue의 우선순위

MicroTask Queue가 Promise가 담기는 곳이다.

MacroTask Queue 일반적인 Task Queue이다.

MicroTask Queue가 Task Queue보다 우선순위를 가진다.

출처 : ✨♻️ JavaScript Visualized: Event Loop

 

'JavaScript' 카테고리의 다른 글

JavaScript(6) - async/await  (0) 2022.05.05
JavaScript(4) - JavaScript의 비동기처리  (0) 2022.05.03
JavaScript(3) - 실행 컨텍스트  (0) 2022.05.02
JavaScript(2) - 20220425  (0) 2022.04.25
JavaScript(1) - 20220419  (0) 2022.04.19

1. JavaScript 코드 처리 로직과 필수 모듈

1. V8엔진

  • V8엔진은 싱글스레드로 동작한다.
  • JavaScript는 인터프리팅 언어이다. V8엔진은 JavaScript코드를 해석하고 실행한다. 
  • callstack에 쌓인 호출된 함수들을 순차적으로 실행한다.
  • 기본적인 변수, 객체등을 관리한다.

2. Web APIs

  • V8엔진은 싱글스레드 이므로 한번에 한가지 동작만 가능하다.
  • 정해진 함수를 제공 받아 비동기적 제어 흐름을 가질수 있다. 
  • 이때 정해진 함수들은 callstack에 쌓인후 Web API모듈로 이동해서 Web API들의 도움을 받아 처리가 된다.
  • 정해진 함수들에는 callback함수와 함께 Web API모듈로 이동된다.
  • 그렇게 모듈로 이동된 함수들 외의 것들은 callstack에 쌓인 순서대로 계속 진행이 된다.

3. Queue영역

  • 정해진 함수들이 실행이 완료되면 callback함수들이 Queue영역으로 이동한다.  

4. Event Loop

  • Queue영역에 있는 callback함수들을 다 비워져 있는 callstack으로 이동을 시켜줘서 함수들을 실행가능하게 만든다.
  • callstack이 완전히 다 비워져있어야 Queue영역에서 이동이 가능하다

 

2. setTimeout함수예제를 통한 비동기 코드의 일련의 처리 과정

출처 : ✨♻️ JavaScript Visualized: Event Loop

'JavaScript' 카테고리의 다른 글

JavaScript(6) - async/await  (0) 2022.05.05
JavaScript(5) - promise  (0) 2022.05.03
JavaScript(3) - 실행 컨텍스트  (0) 2022.05.02
JavaScript(2) - 20220425  (0) 2022.04.25
JavaScript(1) - 20220419  (0) 2022.04.19

1. 실행 컨텍스트

1. 실행 컨텍스트란?

  • 실행 컨텍스트는 자바스크립트 코드가 실행되는 환경이다.
  • 코드에서 참조하는 변수, 객체(함수 포함), this등에 대한 레퍼런스가 있다.
  • 실행 컨텍스트는 전역에서 시작해, 함수가 호출될 때 스택에 쌓이게 된다.
  • 중요한 점은 실행 컨텍스트에 이름에 맞게 함수가 실행이 될 때 문맥이 만들어 진다.

2. practice - 실행 컨텍스트 작성

let a = 10;
function f1() {
    let b = 20
    function print(v) { console.log(v) }
    function f2() {
        let c = 30
        print(a + b + c)
    }
    f2();
}
f1();

 

step1. 전역

'전역 컨텍스트': {
  '변수 객체': {
    arguments: null,
    variable: [ { 'a': 10 }, { 'f1': function } ]
  },
  scopeChain: ['전역 변수 객체'],
  this: window
}
  • 변수가 변수 객체에 변수와 할당된 값이 들어간다.
  • 함수 선언식의 경우 선언과 동시에 변수 객체에 변수로 집어 넣어지고 동시에 함수 정의 내용도 할당된다.
  • 함수 표현식의 경우에는 변수 객체에 변수로 집어 넣어지고 동시에 함수 정의 내용이 할당된다. 그래서 선언식의 경우에는 호출문이 먼저있고 함수가 나중에 있어도 함수가 정상 작동 하지만 표현식은 컨텍스트 상 변수는 있지만 내용이 할당되기 전이라 호출문이 먼저 있다면 에러가 발생한다.

step2. f1() 호출

'f1 컨텍스트': {
  '변수 객체': {
    arguments: null,
    variable: [ { 'b': 20 }, { 'print': function }, { 'f2': function } ]
  },
  scopeChain: ['전역 변수 객체', 'f1변수 객체'],
  this: window
}

 

step3. f2() 호출

'f2 컨텍스트': {
  '변수 객체': {
    arguments: null,
    variable: [ { 'c': 30 } ]
  },
  scopeChain: ['전역 변수 객체', 'f1변수 객체', 'f2변수 객체'],
  this: window
}

 

step4. print(a + b + c) 호출

'print 컨텍스트': {
  '변수 객체': {
    arguments: [{ v: 60 }],
    variable: null
  },
  scopeChain: ['전역 변수 객체', 'f1변수 객체', 'f2변수 객체', 'print변수 객체'],
  this: window
}
  • print(a + b + c) 호출 될때 실행 컨텍스트가 생성이된다. 
  • 이때 a, b, c는 스코프 체인을따라 각각의 변수들을 찾아서 대입시킨다.

3.this를 결정 짓는 방법 - this는 함수가 실행될 때 결정이된다.

const obj = {
    name: "seo",
    sayName: function() {
        console.log("sayName: ", this);
        function inner1() {
            console.log("inner1: ", this);
        }
        const inner2 = () => {
            console.log("inner2: ", this);
        }
        function bindedInner() {
            console.log("bindedInner: ", this)
        }
        inner1();
        inner2();
        bindedInner.bind(obj)();
    },
    sayName2: () => {
        console.log("sayName2: ", this);
        function inner3() {
            console.log("inner3: ", this);
        }        
        const inner4 = () => {
            console.log("inner4: ", this);
        }
        inner3();
        inner4();
    }
}

obj.sayName();
obj.sayName2();
const sayN = obj.sayName;
const sayN2 = obj.sayName2;
sayN();
sayN2();

callstack - (설명의 편의를 위해 함수가 끝난후 스택을 지우지는 않았음)

inner4() -> this: window(화살표 함수 이므로 부모인 sayN2의 this)
inner3() -> this: window
sayN2() -> this: window
bindedInner() -> this: obj(일반함수에서 bind, call, apply를 해주면 this를 명시할 수 있다.)
inner2() -> this: window(화살표 함수 이므로 부모인 sayN의 this)
inner1() -> this: window
sayN() -> this: window
inner4() -> this: window(화살표 함수이므로 부모인 sayName2의 this)
inner3() -> this: window
obj.sayName2() -> this: window(화살표 함수이므로 부모인 anonymous의 this)
bindedInner() -> this: obj(일반함수에서 bind, call, apply를 해주면 this를 명시할 수 있다.)
inner2() -> this: obj (화살표 함수의 this 부모의 this 그러므로 부모인 sayName의 this)
inner1() -> this: window
obj.sayName() -> this: obj (객체로 부터 호출 일반함수의 this는 자신을 호출한 객체)
anonymous -> this: window

 

4. this 결정에 대한 다른 예제 (조현영님 강의 발췌)

var relationship1 = {
    name: "zero",
    friends: ["nero", "hero", "xero"],
    logFriends: function () {
        var that = this;
        this.friends.forEach(function (friend) {
            console.log(this, friend);
            console.log(that.name, friend);
        });
    },
};

relationship1.logFriends();
  • that의 경우 logFriends를 호출한 relationship1을 가리킨다. 
  • 그래서 relationship1.name과 같으므로 결과는 zero이다
  • 한편 forEach의 콜백함수는 단독으로 사용된 것과 마찬가지 이므로 그안에서의 this는 전역객체인 window를 가리킨다.
const relationship2 = {
    name: "zero",
    friends: ["nero", "hero", "xero"],
    logFriends() {
        this.friends.forEach(friend => {
            console.log(this.name, friend);
        });
    },
};

relationship2.logFriends();
  • 반대로 forEach의 콜백함수가 화살표 함수일 경우 부모의 this와 같으므로 relationshop2를 가리키므로 this.name은 zero이다.

'JavaScript' 카테고리의 다른 글

JavaScript(5) - promise  (0) 2022.05.03
JavaScript(4) - JavaScript의 비동기처리  (0) 2022.05.03
JavaScript(2) - 20220425  (0) 2022.04.25
JavaScript(1) - 20220419  (0) 2022.04.19
JavaScript(5)  (0) 2022.03.30

1. jQuery맛보기

1. jQuery사이트에서 cdn을 가져온다.

<!DOCTYPE HTML>
<html>

<head>
    <title>document</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>

<body>
    <script>
        document.querySelector("body").sytle.backgroundColor = "red";
        $("body").css("background-color", "red");
        $("body").css("background-color", "red").css("color", "white");
    </script> 
</body>

</html>
  • jQuery는 반복문을 거의 사용하지 않는다 jQuery객체에 의해 선택된 태그는 전부 바뀌기 때문이다.
  • 그래서 특정 요소만 바뀌기를 원한다면 클래스나 아이디를 지정해준다. 
<script>
	$("#id").css("background-color", "red").css("color", "white");
</script>
  • id 지정도 가능하고 체이닝 형식으로 코드를 작성할 수 있다.

 

2. export, import -> 모듈화

1. 개발하는 애플리케이션의 크기가 커지면 언젠간 파일을 여러 개로 분리해야 하는 시점이 온다. 이때 분리된 파일 각각을 '모듈(module)'이라고 부르는데, 모듈은 대개 클래스 하나 혹은 특정한 목적을 가진 복수의 함수로 구성된 라이브러리 하나로 구성된다.

 

2. JavaScript코드를 모듈화하는데 핵심이며, ES6에서 도입된 최신 문법이다. 

 

3. 사용법

  • 외부에 공개하려는 모듈은 export 해야 하고, 내보내진 모듈을 가져와 사용하려면 import 해줘야 한다.

export 방법

test.js

export let a = 3
export let b = {a:3, b:3, c:3}
export let c = [1, 2, 3]
export function test1() {...}
export function test2() {...}
export function test3() {...}
  • 각각을 export로 명시할 수 있다.
let a = 3
let b = {a:3, b:3, c:3}
let c = [1, 2, 3]
function test1() {...}
function test2() {...}
function test3() {...}

export {a, b, c, test1, test2, test3}
  • 혹은 한번에 묶어서 export할 수 있다.
let a = 3
let b = {a:3, b:3, c:3}
let c = [1, 2, 3]
function test1() {...}
function test2() {...}
function test3() {...}

export {a as variableA, test1 as t1, test2 as t2}
  • 내보낼때 이름을 다르게 지정할 수 있다.
function test1() {...}

export default test1
  • export default는 명시적으로 하나만 내보내겠다는 뜻이다. 여기서 여러개를 내보내려 한다면 에러가 발생한다.

import 방법

main.js

import {a, b, c, test1, test2, test3} from "./test.js"
  • export로 묶어서 내보낸 경우는 그 파일안에서 사용한 변수명을 그대로 사용해야 한다.
import {a as variableA, b as varialbeB} from "./test.js"
  • 변수명을 바꾸고 싶다면 위와 같이 바꿔줄 수 있다.
import * as it from "./test.js"
console.log(it.a);
console.log(it.b);
console.log(it.c);
console.log(it.test1());
console.log(it.test2());
console.log(it.test3());
  • 모두 한번에 가져와서 접근형식으로 사용할 수 있다.
import myTest from "./test.js"
  • export default로 내보냈을 경우 export로 내보냈을 때와 크게 차이가 2가지 정도 있다
  • 첫번째는 {} 없이 가져오는 것이고 두번째는 변수명을 가져올 때 사용자가 임의로 지정할 수 있다.
<script type="module"></script>
  • script태그에서 사용을 하려면 type을 명시해줘야 한다. 그후 src로 가져오거나 script태그 안에서 import를 사용하여 각 모듈을 사용한다.
  • import와 export의 사용 방법은 여러가지 이지만 항상 약속을 정하고 일관되게 사용하는 것이 옳다고 생각한다.

 

3. component 맛보기

1. 모듈화를 활용한 웹페이지 구성

 

2. render를 통해 HTML요소를 반환하는 함수이다. 독립적이고, 재사용 가능한 UI조각이다.

 

3. class component와 functional component가 있다. 기반이 class, function의 차이이다. 현재는 거의 functional component를 사용한다.

 

4. component의 이름은 항상 대문자로 시작한다.

function ComponentTest() {
	return (
    	<div>
        	...
        </div>
    )
}

export default Component
  • 이런식으로 파일을 작성하여 내보낸다. 항상 <div>태그로 묶어서 내보내야 한다.

 

4. 자주 사용하는 내장객체 메서드

1. Array

let arr = [1, 2, 3, 4, 5, "a", "b", 7, 8];

//callback 함수의 별도의 return값이 없고 각 요소마다 함수를 실행
arr.forEach((element, index) => {...}) 

//callback함수가 요소를 순회하면서 실행결과에 따른 새로운 배열을 반환
let newArr = arr.map((element, index) => {return ...}) 

//callback함수의 return 값이 true인것만 return하여 새로운 배열을 반환
let filterdArr = arr.filter((element, index) => {return true/false}) 

//accumulator의 값을 어떻게 축적을 할 지 callback함수에 정의하여
//return하여 최종적으로 하나의 값으로 반환시킨다. 
let newNum = arr.reduce((accumulator, currentValue, index) => {return...}, initialValue)

//callback 함수를 정의해서 사용
arr.sort((a, b) => b - a);

//배열을 문자열로 변환 join의 인자는 뭐든지 될 수 있음
let str = arr.join("")

2. String

let str = 'JavaScript';

str.concat("Hello") //JavaScriptHello
str.charAt(index)
str.charCodeAt(index)
String.fromCharCode(65) //A
str.split("") //공백 없이 나누면 문자 전체를 배열로 공백을 두면 단어를 배열로
str.trim() //공백 제거
str.toLowerCase()

3. Math

Math.PI // 3.14
Math.ceil() //올림
Math.floor() //내림
Math.round() //반올림
Math.random() //0~1사이 숫자
Math.sqrt() //제곱근
Math.pow(a, b) //a의 b승

4. Number

Number('123'); // 123
Number('123') === 123; // true
Number('12.3'); // 12.3
Number('12.00'); // 12
Number('123e-1'); // 12.3
Number(''); // 0
Number(null); // 0
Number('0x11'); // 17
Number('0b11'); // 3
Number('0o11'); // 9
Number('foo'); // NaN
Number('100a'); // NaN
Number('-Infinity'); // -Infinity

let a = 312.3154
a.toFixed(2) //312.31

let b = 2342422;
b.toLocaleString() // 2,342,422

Number.isInteger(10 / 3) //false

 

-내장 객체 메서드는 많이 존재한다 현재는 내가 사용해본 것을 정리한 것이다. 공식 문서를 보면서 그때마다 필요한 것을 찾는것이 중요하다고 생각한다.

 

 

5. rest operator, spread operator

  • spread operator: 묶여있던 것을 풀어주는 역할, 차원을 낮춰주는 역할을 한다. 
  • rest operator: 흩어져있는 요소를 묶어준다. (항상 나중에 써줘야 한다 rest란 의미 그대로 나머지라는 뜻)
/* Spread 문법을 사용한 매개변수 정의 (= Rest 파라미터)
   ...rest는 분리된 요소들을 함수 내부에 배열로 전달한다. */
function foo(param, ...rest) {
  console.log(param); // 1
  console.log(rest);  // [ 2, 3 ]
}
foo(1, 2, 3);

/* Spread 문법을 사용한 인수
  배열 인수는 분리되어 순차적으로 매개변수에 할당 */
function bar(x, y, z) {
  console.log(x); // 1
  console.log(y); // 2
  console.log(z); // 3
}

// ...[1, 2, 3]는 [1, 2, 3]을 개별 요소로 분리한다(-> 1, 2, 3)
// spread 문법에 의해 분리된 배열의 요소는 개별적인 인자로서 각각의 매개변수에 전달된다.
bar(...[1, 2, 3]);
// ES6
function foo(v, w, x, y, z) {
  console.log(v); // 1
  console.log(w); // 2
  console.log(x); // 3
  console.log(y); // 4
  console.log(z); // 5
}

// ...[2, 3]는 [2, 3]을 개별 요소로 분리한다(→ 2, 3)
// spread 문법에 의해 분리된 배열의 요소는 개별적인 인자로서 각각의 매개변수에 전달된다.
foo(1, ...[2, 3], 4, ...[5]);
// 객체의 병합
const merged = { ...{ x: 1, y: 2 }, ...{ y: 10, z: 3 } };
console.log(merged); // { x: 1, y: 10, z: 3 }

// 특정 프로퍼티 변경
const changed = { ...{ x: 1, y: 2 }, y: 100 };
// changed = { ...{ x: 1, y: 2 }, ...{ y: 100 } }
console.log(changed); // { x: 1, y: 100 }

// 프로퍼티 추가
const added = { ...{ x: 1, y: 2 }, z: 0 };
// added = { ...{ x: 1, y: 2 }, ...{ z: 0 } }
console.log(added); // { x: 1, y: 2, z: 0 }
// Spread 
const n = { x: 1, y: 2, ...{ a: 3, b: 4 } };
console.log(n); // { x: 1, y: 2, a: 3, b: 4 }

// Rest 
const { x, y, ...z } = n;
console.log(x, y, z); // 1 2 { a: 3, b: 4 }

 

'JavaScript' 카테고리의 다른 글

JavaScript(4) - JavaScript의 비동기처리  (0) 2022.05.03
JavaScript(3) - 실행 컨텍스트  (0) 2022.05.02
JavaScript(1) - 20220419  (0) 2022.04.19
JavaScript(5)  (0) 2022.03.30
JavaScript(4) - let, const  (0) 2022.03.29

이번 포스팅은 JavaScript의 순수 언어로써의 특징보다는 웹과 상호작용할 때 필요한 부분을 먼저 정리할 것이다.

 

1. DOM (Document Object Model - 문서 객체 모델)

1. DOM은 HTML 문서의 프로그래밍 인터페이스이다.

  • HTML 문서를 계층적 구조로 표현
  • 구조화된 표현을 제공하여 문서의 구조, 스타일, 내용 등을 바꿀 수 있다.
  • window객체는 말 그래도 창전체를 의미하고 document객체는 웹페이지 자체를 의미한다. 그래서 웹페이지를 구성하는 요소에 접근, 생성, 요소에 대한 이벤트 추가 등을 할 때 document객체로부터 시작된다.

  • 노드객체는 DOM에서 정보를 저장하는 계층적 단위이다.
  • 노드의 종류
    1. 문서노드 - 최상위노드
    2. 요소노드(elementNode) - 속성노드를 가지는 유일한 노드(태그를 의미)
    3. 속성노드(attributeNode) - 태그가 가지는 속성을 의미
    4. 텍스트노드 - HTML문서내에 요소이외에 있는 텍스트들을 의미

 

2. event

1. event는 웹브라우저가 알려주는 HTML요소에 대한 사건의 발생을 알려주는 객체이다.

2. event.preventDefault() 해당요소가 가지고 있는 기본 동작을 막는다는 의미이다. 자주 사용하고 용이한 메서드이다.

 

3. JavaScript와 HTML

1. 요소에 접근하는 방법

document.querySelector("css선택자") #id일때는 유일하지만 .class일때는 가장 첫번째 보이는 요소를 반환
document.querySelectorAll("css선택자") .class일때 class에 속한 모든 요소를 배열로 반환
document.getElementById("id"); id값으로 요소를 찾음
document.getElementsByClassName("classname"); class에 속한 모든 요소를 배열로 반환 class에 속한 요소가 하나라면 그것을 이용하기 위해선 뒤에 인덱스 [0]을 붙여줘야함
document.getElementsByTagName("tagname"); 지정한 tag를 배열로 모두 반환

 

 

2. 알아두면 편리한 태그 관련 메서드(모두 문서노드 또는 선택된 요소에서 메서드를 사용한다.)

  • firstChild, lastChild, firstElementChild, lastElementChild -> 요소가 가지고 있는 첫번째 또는 마지막 자식들을 반환 보통은 마지막 두개를 사용
  • childNodes, children -> 요소가 가지고 있는 자식을 배열로 반환
  • classList -> 요소가 가지고 있는 클래스를 배열로 반환 || add("클래스 이름") -> 요소의 클래스에 다른 클래스를 추가 || remove("클래스 이름") -> 클래스 삭제
  • append("추기힐 요소"), appendChild("추기힐 요소") -> 요소에 자식(또 다른 요소)을 추가할 때 사용
  • remove() -> 자기 자신을 삭제 || removeChild("자식 요소") -> 자식을 삭제 
  • append(), remove()의 경우는 js가 제공하는 메서드
  • innerText -> 요소에 텍스트를 작성 || createTextNode와는 조금 다름
  • innerHTML -> 요소에 HTML을 직접 작성 가능
  • addEventListener -> 요소에 event에 대한 동작, 기능을 정의할 때 사용
  • getAttribute("태그 속성이름") -> 요소에 대한 속성에 접근을 한다.

'JavaScript' 카테고리의 다른 글

JavaScript(3) - 실행 컨텍스트  (0) 2022.05.02
JavaScript(2) - 20220425  (0) 2022.04.25
JavaScript(5)  (0) 2022.03.30
JavaScript(4) - let, const  (0) 2022.03.29
JavaScript(4) - var  (0) 2022.03.29

+ Recent posts