mjeongriver
Published 2023. 1. 12. 18:26
day64-JS ES6 문법 TIL/Javascript

1. let과 const

1) let 변수는 중복 선언이 불가능하다.

2) let 변수의 유효범위는 {} 블록이다.

    //let변수는 같은 블록에서 내에서 중복이 불가능하다.
    let y = 1;
    // let y = 100; //에러

    //let변수의 유효범위는 {}블록이다
    let z = 10;
    if(true) {
        let z = 100;
        console.log(z); //100
    }
    console.log(z); //10
const GENDER = "남자";
    // var GENDER = "여자"; //에러
    // GENDER = "여자"; //에러

    const arr = ["홍길동", "이순신", "홍길자"];
    // arr = ["김철수"]; //에러
    arr[0] = "김철수"; //내부의 값 변경은 허용
    arr.push("박영희"); //내부의 값 추가 허용

    //객체에서의 수정
    const P1 = {"name" : "홍길동" };

    // P1 = {"name" : "이순신"}; //P1을 전부 바꾸는 코드는 에러
    P1.name = "이순신"; //내부의 값의 변경은 허용
    P1.age = 20; //내부의 값의 추가도 허용
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>


    <ul class = "list">
        <li>목록1</li>
        <li>목록2</li>
        <li>목록3</li>
        <li>목록4</li>
    </ul>

    <script>
        let x = 1;
        // let x = 1; 중복 선언이 안됨
        
        //let변수는 중괄호 스코프 
        if(true) {
            let x = 10;
            console.log(x); //10
        }

        console.log(x); //1
        
       /*  
       var lis = document.querySelectorAll(".list li");
        //var는 함수 스코프라서 함수에서 선언된 애들은 for문에서 i가 살아 있음(그래서 계속 눌렀을 때 4가 나옴)
        //이걸 해결할 수 있는 방법은 closer을 이용하는 방법임(함수 안에서 변수의 값을 기억한다)
        for(var i = 0; i < lis.length; i++) {
            (function(x) {
                lis[x].onclick = function(){
                    console.log(x);
                }
            })(i);
        } 
        */

        //위와 같이 사용할 수 있음(let 변수 사용시)
        let lis = document.querySelectorAll(".list li");
        for(let i = 0; i < lis.length; i++){
            lis[i].onclick = function(){
                console.log(i);
            }
        }
    </script>
    
</body>
</html>
		const gender = "남자";
        // gender = "여자"; 

        const arr = [1,2,3];
        // arr = [1]; //배열을 통째로 변경하는 것은 불가함
        arr[0] = 10; //0번째의 값을 10으로 변경한다.
        arr.push(4); //4를 뒤에 추가한다.
        console.log(arr);

        const obj = {name : "홍길동"};
        // obj = {name : "이순신"}; //객체를 통째로 변경하는 것은 불가함.
        obj["name"] = "이순신"; //변경하는 건 가능함
        obj["age"] = 10; //추가하는 것도 가능
        console.log(obj);

 

2. 1) spread operator(전개 구문) : ...로 표기하면 요소들을 추출할 수 있음. 

1) 반복 가능한(iterable)에 적용할 수 있는 문법입니다.

2) 배열이나 문자열 등을 아래처럼 풀어서 요소 하나 하나로 전개시킬 수 있습니다.

  const arr = [1,2,3];
    console.log(...arr); //num의 요소들을 추출
    
    const str1 = 'hello'; 
    const str2 = [...str1]; 
    console.log(str2); // [ "h", "e", "l", "l", "o"]
	
    //배열에서 전개구문
    //배열의 추가
    const num1 = [10, 20, 30, ...arr];
    console.log(num1)

    //배열의 중간추가
    const num2 = [10, 20, ...arr, 30];
    console.log(num2)

    //배열의 복사
    const num3 = [...arr]; //splice와 유사(복사)
    console.log(num3)

    //배열 연결
    const num4 = [...arr, ...arr]
    console.log(num4)

 

2. 2) 함수에서의 spread operator

 const num = [1,2,3];

    //함수의 전달
    function sum(x, y, z) {
        return x + y + z;
    }
    console.log( sum(...num) ); //num의 요소를 x,y,z로 전달
    console.log( sum(10, ...num) ); //10, 1, 2, 3을 전달


    //함수의 매개변수의 사용(가변적 매개변수) - 단 마지막에 작성해야 합니다.
    function sum2(x, ...arr) {
        return [x, ...arr]; //리스트 반환
    }

    console.log( sum2("홍길동", 1) )
    console.log( sum2("홍길동", 1,2) )
    console.log( sum2("홍길동", 1,2,3) )


    //함수의 default매개값
    function sum3(x, y = 10, z = 100) {
        return x + y + z;
    }

    console.log( sum3(1) ) //111
    console.log( sum3(1, 2) ) //103
    console.log( sum3(1, 2, 3) ) //6
    console.log( sum3(...[1,2] )) //1,2를 추출해서 전달 //103
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <script>
        function sum(x, y, z){
            return x + y + z;
        }

        let arr = [1, 2, 3];

        //sum(arr[0], arr[1], arr[2]);
        console.log( sum(...arr) );
        console.log( sum(10, ...arr)); 10, 1, 2, 3 //위에 sum return에 x + y + z

        //함수를 선언 시 - 가변적 매개변수(반드시 맨 마지막에 선언)
        function sum2(x, ...y){ //...y, x는 안됨(맨 마지막에 선언 잊지 말기)
            return [x, ...y];
        }

        console.log(sum2(1));
        console.log(sum2(1,2));
        console.log(sum2(1, 2, 3));
        console.log(sum2(1, 2, 3, 4));

        //함수의 default 매개변수
        function sum3(x, y = 10, z = 100) {
            return x + y + z;
        }

        console.log(sum3(1) ); //111
        console.log(sum3(1, 2)); //x = 1, y = 2가 들어가서 103 결론값
        console.log(sum3(1,2,3)); //6
        console.log(sum3(...arr)); //6
        

        

         

        
    </script>
</body>
</html>

 

3. destructuring assignment(구조 분해 할당)

1) 배열에서 destructuring

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <script>
        let arr = [1, 2, 3, 4];
        // let a1 = arr[0];
        // let a2 = arr[1];

        let [a, b, c, d] = arr;
        console.log(a);
        console.log(b);
        console.log(c);
        console.log(d);

        let [a1, a2] = arr;
        console.log(a1, a2); //1, 2

        let [k1, , , k4] = arr;
        console.log(k1, k4); //1, 4

        let [y1, ...y2] = arr;
        console.log(y1, y2); //1, [2,3,4] 뒤에 배열로 반환

        let [...ar] = arr;
        console.log(ar); //[1,2,3,4]

        function useState() {
            return [1, function() {}];
        }

        let [n1, n2] = useState();
        console.log(n1, n2); //1, function





    </script>

</body>
</html>

 

2) 객체에서 destructuring

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <script>
        let obj = {"name" : "홍길동", "age" : 20};

       /*  console.log(obj.name);
        console.log(obj["name"]); */

       /*  let {name} = obj; //객체니까 중괄호(name에 대한 키값)
        console.log(name); */

        /* let {name, age} = obj;
        console.log(name, age);

        let {...arr} = obj; //객체를 통째로 가지고 나옴
        console.log(arr); */

        let person = {
            name: "홍길동",
            age: 30,
            job: ["js", "css"],
            info: {id : "aaa123"}
        }

        // let {name, job}= person;
        // console.log(name, job);

        // let {name, job, info} = person;
        // console.log(name, job, info);

        //객체의 값을 다른 이름으로 가지고 나오기
        let {name: aaa} = person; //name을 aaa 이름으로 가지고 나오기
        console.log(aaa);

        let {name: bbb, job: jjj} = person;
        console.log(bbb, jjj); //name과 job의 값이 나옴


    </script>

</body>
</html>

 

4. for of문

1) 반복 가능한 객체를 for문 안에서 반복시켜 연속된 결과값을 얻습니다.

2) foreach문에서 지원하지 않는 break, continue, return의 사용 가능

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script>
        let arr = ["a", "b", "c"];

        // for(let i in arr){
        //     console.log(i); //index
        // }

        for(let i of arr) {
            console.log(i); //value
        }

        for(let i of "hello world"){
            console.log(i);
        }

        let person = [
            {id : "aaa", age : 10}, 
            {id : "bbb", age : 20}
        ];

        //구조 분해 할당
        for(let {id, age} of person) {
            console.log(id);
            console.log(age);
        }

        //객체를 반복할 수는 없음
       /*  
       let obj = {a: 1, b: 2}; //obj is not iterable
        for(let i of obj) {
            console.log(i);
        } 
        */

    </script>
    
</body>
</html>

 

5. backtick(문자열 안에서 값이 나올 수 있음)

1) 백틱 `(tap버튼 위에)을 용해서 문자열을 표현하고, 템플릿 리터럴 ${}를 이용해서 필요값을 처리

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <script>
        
        let name = "이순신";
        let age = 20;

        console.log("이름은:" + name + "이고, 나이는:" + age + "입니다");
        console.log(`제 이름은 ${name}이고 나이는 ${age}입니다`);

    </script>
</body>
</html>

 

6. Arrow function(화살표 함수)

1) 화살표 함수는 기본적으로 익명 함수를 대체합니다. (호이스팅 불가)

2) 가독성이 향상됩니다.

* 문법 1

- 코드가 한줄이면 {} 생략이 가능하다.

- {}를 쓰지 않으면 기본값으로 undefined를 반환합니다.

- {}를 쓰지 않고 구문을 작성하려면 리턴문이 됩니다.

 

* 문법 2

- 매개변수가 1개라면, 매개 변수 자리의 ()의 생략이 가능합니다.

 

* 문법 3

- 객체를 반환 할 때는 ()를 묶어줍니다.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>

        //기본적으로 익명 함수를 대체합니다.


        /*  
        var a = function(){
             console.log("a실행");
         } 
         */


        //위와 완전 같음
        let a = () => {
            console.log("a실행");
        }
        a();

        /* 
        문법1 - 코드가 한줄이면 {} 생략이 됩니다. 
        {}를 생락하면 자동으로 return이 붙습니다.
        */

        //아래와 같음
        /* let b1 = () => {
            return console.log("b실행");
        } */
        let b1 = () => console.log("b실행");
        b1();

        let b2 = (a, b, c) => a + b + c;
        console.log(b2(1, 2, 3));

        let b3 = (a = 10) => a + 100;
        console.log(b3()); //110
        console.log(b3(20)); //120

        /*
        문법2 - 매개변수가 1개라면 () 생략이 됩니다.
        */

        let c1 = a => a + 10;
        console.log(c1(10)); //20

        /*
        문법3 - 객체를 반환할 때는 ()로 묶어줍니다.
        */

        //1st
        let c2 = () => {
            return { key: 1, age: 20 }
        };

        //2nd
        let c3 = () => ({ key: 1, age: 20 }) //객체를 반환할 때 쓰는 문법

        console.log(c3());

        //
        /*
        setInterval(function() {
            console.log(1);
        }, 1000);

        setInterval(() => {
            console.log(1), 1000);
        }
         */

         /* fetch("..").then(res => res.json())
                    .then */

                    




    </script>

</body>

</html>

 

7. 화살표 함수의 응용 forEach, filter, map

1) forEach - 반복문

array.forEach(callbackFunction(currenValue, index, array), thisArg) 

- currenValue: 현재 값

- index: 현재 인덱스

- arrayt: 현재 배열

- thisArg: callbackFunction 내에서 this로 사용될 값

 

2) filter - 요소 개수만큼 반복하며 boolean을 이용한 새로운 list를 만듬(콜백에 리턴이 true인 값을 이용해서 새로운 배열을 반환)

array.filter(callbackFunction(currenValue, index, array), thisArg) 

 

3) map - 실행한 결과를 가지고 새로운 배열을 만들 때 사용

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>
        //forEach(콜백함수, thisArg: 옵션)
        //forEach( function(현재값, 인덱스, 현재 배열) {}, thisArg )

        /* 
        let arr = ["a", "b", "c", "d"];
        arr.forEach(function(value, index, arr) {
            console.log("값" + value + ", 인덱스" + index + ", 배열" + arr);
        });

        arr.forEach(function(value) {
            console.log(value);
        })

        arr.forEach((value, index, arr) => {
            console.log(`값 ${value}, 인덱스 ${index}, 현재 배열 ${arr}`)
        }) 
       
        arr.forEach( value => console.log(value));
        */

        //필터 함수 - 콜백에 리턴이 true인 값을 이용해서 새로운 배열을 반환
        //filter (콜백(값, 인덱스, 현재 배열), thisArg)
        let arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

        /* 
        arr2.filter(function (value, index, arr) {
            console.log(value, index, arr);
        })

        let result = arr2.filter(function (a, b, c) {
            // console.log(a, b, c);
            return a % 2 == 0;
        })
        console.log(result); 
        */

        // let result = arr2.filter((a) => a % 2 == 0);
        // console.log(result);

        //배열 요소 중에 o가 들어간 문자열만 필터링
        // let arr3 = ["melon", "apple", "orange", "grape", "mango"];
        // let result = arr3.filter(a => a.indexOf("o") != -1); //매개변수가 하나면 괄호 생략이 가능함
        // //includes도 가능
        // let result2 = arr3.filter(x => x.includes('o'));  
        // console.log(result);
        // console.log(result2);

        //map함수 - 실행한 결과를 가지고 새로운 배열을 만들 때 사용
        //mpa(콜백(현재값, 인덱스, 현재 배열), thisArg)
        let arr4 = [1, 3, 5, 7, 9];

        // let result = arr4.map(function(a, b, c) { //현재 값, 인덱스, 배열
        //     return a + 1;
        // })

        // console.log(result);

        // let result = arr4.map((a) => a + 1);
        // console.log(result);

        let arr3 = ["melon", "apple", "orange", "grape", "mango"];
        // let result = arr3.filter(a => a.includes('o'));
        // console.log(result);

        // let result3 = result.map((x, y) => `o가 들어간 과일 중 ${x}는 ${y + 1}번째 입니다.`);
        // console.log(result3);

        // let result4 = arr3.filter(a => a.includes('o')).map((x, y) => `o가 들어간 과일 중 ${x}는 ${y + 1}번째 입니다.`);
        // console.log(result4);

        let result5 = arr3.filter( (x) => x.indexOf("o") != -1)
            .map((x, y) => `o가 들어간 과일은 ${x}는 ${y + 1}번째`);
            console.log(result5);

    </script>

</body>

</html>

 

8. class

- 일반 html에서는 굳이 class를 사용하진 않습니다.

- react의 class 컴포넌트를 사용한다며 알아두세요.

1) 클래스의 멤버변수를 선언할 때는 키워드를 사용하지 않습니다(구형 브라우저에서는 지원 불가 할 수 있음)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script>
        class Person {
            //멤버 변수
            name = "홍길동";
            age = 20;
            state = {a : 1};
            
            //생성자는 js에서 반드시 1개 입니다.
            //js는 this키워드를 지칭하면 멤버 변수가 자동 생성 됩니다.
            constructor(addr) {
                this.addr = addr;
            }

            //함수
            func = () => {
                console.log("func 실행")
            }
        }
            //객체로 생성 - 허용 됩니다
            let p = new Person();
            console.log(p.name); //멤버변수 접근
            console.log(p.age); //멤버변수 접근
            console.log(p.state.a); //멤버변수 접근

            p.func();

            //생성자를 통한 생성
            let p2 = new Person("서울");
            console.log(p2.addr);



        
    </script>
    
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        class Shape {
            constructor() {

            }

            func = () => {
                console.log("func 호출")
            }
        }

        class Rect extends Shape {
            //프로그래머가 생성자를 직접 만들게 되면 super()를 통해 연결해야 합니다.
            constructor(w, h) {
                super(); //부모의 생성자 연결(자바와 동일)
                this.w = w; //멤버 변수에 w 저장
                this.h = h;
            }

            //set
            setW = (w) => {
                this.w = w;
            }

            //get
            getW = () => {
                return this.w;
            }

            //set, get, static 같은 키워드들로 함수를 설정 할 수 있습니다.
        }
        
        //객체 생성
        let rect = new Rect();
        rect.func(); //물려 받음

        //객체 생성
        let rect2 = new Rect(10, 20);
        console.log(rect2.w); 
        console.log(rect2.h);
        
        rect2.setW(30);
        rect.getW(rect2.getW());
      

    </script>
</body>
</html>

 

9. module import export

* 모듈 임포트
- 모듈은 JS ES6문법에서 미리 작성해 놓은 스크립트 파일이며, 모듈 안에는 변수, 함수, 클래스 등이 정의되어 있습니다.
- ES6부터는 주요기능들을 모듈로 구성하여 사용이 가능합니다.
- 모듈을 내보내는 방법은 named export방식과 default export방식 2개가 있습니다.
- 여러 값을 내보낼 때 named export방식
- 단일 값을 내보낼 때 default export방식

- HTML5파일에서 예외적으로 module을 사용할려면 type="module" 문을 반드시 작성합니다.

- 하나의 모듈에서 하나의 객체를 이름으로 내보낼 때 단일 객체 내보내기 export default문을 사용합니다.
- Class나 함수를 내보낼떄는 세미콜론을 붙이지 않도록 권유됩니다.

 

* 예제 1~2(html, js)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script type="module">
    //예제에서 module을 사용하려면 type을 반드시 적어야 됩니다.
    import {name, age, info, addr, myInfo} from './index01.js';
    
    console.log(name);
    console.log(age);
    info();
    console.log(addr);
    myInfo();

    console.log("--------------------------------")
    //import2 - 엘리어스 방식
    import * as test from './index01.js';

    console.log(test.name);
    console.log(test.age);
    test.info();
    console.log(test.addr);
    test.myInfo();

    console.log("--------------------------------")
    //import - 이름 붙여서 가져오기
    import {name as n, age as a} from './index01.js';
    
    console.log(n); //
    console.log(a); //
    
    </script>
    
</body>

</html>
/* 
* 모듈 익스포트, 임포트

- 모듈은 JS ES6의 미리 작성해놓은 스크립트 파일입니다.
- 변수, 함수, 클래스 등의 정의 되어 있습니다.

- 모듈을 내보내는 방식
- 여러 값을 내보낼 때 named export 방식
- 단일 값을 내보낼 때 default export 방식

*/

export const name = "이순신";
export const age = 20;

export const info = () => {
    console.log("이름:" + name + ", 나이:" + age);
}

let addr = "서울시";
let myInfo = () => {
    console.log(addr);
}

export {addr, myInfo};
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script type = "module">

        import Person from './index02.js';

        const p = new Person('hong', 20);
        console.log(p.getInfo());

    </script>
    
</body>
</html>
class Person {
    constructor(name, age) {
        this.name = name; //멤버 변수
        this.age = age;
    }

    getInfo = () => {
        return `이름 ${this.name}, 나이 ${this.age}`;
    }


}

//default 구문은 반드시 1개여야 합니다.
export default Person;

 

'TIL > Javascript' 카테고리의 다른 글

day63-js  (0) 2023.01.09
day62-js  (0) 2023.01.06
day61-js  (0) 2023.01.05
day60-js  (0) 2023.01.04
day59-js  (1) 2023.01.03
profile

mjeongriver

@mjeongriver

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그