JavaScript

JavaScript(이벤트전파, iterable, generator, spread)

code2772 2022. 11. 10. 16:17
728x90
반응형
✔ 이벤트 전파(Event Propagation)
        - 이벤트가 발생했을 때 브라우저가 이벤트 리스너를 실행시킬 대상 요소를 결정하는 과정
        - document 객체나 HTML 문서의 요소에서 이벤트가 발생하면 대상 요소를 결정하기 위해 이벤트 전파가 일어남

        캡처링 전파방식
        - 부모에서 자식으로 이벤트를 전파

        버블링 전파방식
        - 자식에서 부모로 이벤트를 전파

        ✔ 이벤트 전파를 막는 방법
        이벤트객체명.stopPropagation();
<!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>이벤트전파</title>
    <style>
        #divBox{width :100%; height : 300px; border: 3px solid red;}
        #pBox{width :70%; height : 150px; border: 3px solid blue;}
        #spanBox{border: 3px solid gold;}
    </style>
    <script>
        window.onload = function(){
        // 버블링 전파 방식
        // document.getElementById('divBox').addEventListener('click',clickDiv);
        // document.getElementById('pBox').addEventListener('click',clickP);
        // document.getElementById('spanBox').addEventListener('click',clickSpan);

        //캡처링 전파방식 - 부모부터 출력된다.
        document.getElementById('divBox').addEventListener('click',clickDiv, true);
        document.getElementById('pBox').addEventListener('click',clickP, true);
        document.getElementById('spanBox').addEventListener('click',clickSpan, true);
    }
    function clickDiv(e){
        e.stopPropagation();
        document.getElementById('text').innerHTML += "<span style ='color:red;'>div를 클릭했어요</span><br>";
    }
    function clickP(e){
       
        document.getElementById('text').innerHTML += "<span style ='color:blue;'>p를 클릭했어요</span><br>";
    }
    function clickSpan(e){
       
        document.getElementById('text').innerHTML += "<span style ='color:gold;'>span을 클릭했어요</span><br>";
    }
    </script>
</head>
<body>
    <h2>이벤트전파</h2>
    <div id="divBox">
        <p id="pBox">
            <span id="spanBox">
                클릭
            </span>
        </p>
    </div>
    <p id="text"></p>
</body>
</html>

✔ Iterable
- 순화가 가능한 것(탐색이 가능)
const arr = [1,2,3,4,5];
console.log(arr.values());
console.log(arr.entries());
console.log(arr.keys());
//iterable을 이용하여 values,entry,key를 사용할 수 있으며 next사용도 가능하다.
const iterator = arr.values(); // 값이 들어 있는지 확인이 가능하다
while(true){
    const item = iterator.next(); // 다음 줄 내용을 뽑을 경우 반복
    if(item.done) break;// 데이터가 없으면 break, 데이터가 있는지 확인
    console.log(item.value)
}

for(let item of arr){ // for문간에 of를 사용할 수 있는 것들은 거이 iterator한 것이다.
    console.log(item);
}

for(let item of arr.values()){
    console.log(item)
}
generator
- 순회가 가능한 것
- 좀 더 심플하게 사용할 수 있는 객체

function* generatorName(){
실행문
...
}
function* multipleGenerator(){
    try{
        for(let i=0; i<10; i++){
            console.log(i);
            yield i**2; //next 가 나와야 실행
            //yield는 한번만 돌고 다음 next가 다시 와야 한번 더 돈다
           
        }
    }catch(error){// callback으로 사용
        console.log(error);
    }
}

const multiple = multipleGenerator();
let next = multiple.next();
console.log(next.value, next.done);
// 끝이 아닐경우 next.done은 false가 나온다
next = multiple.next();
console.log(next.value, next.done);
next = multiple.next();
console.log(next.value, next.done);



✔ Spread 연산자, 전개구문
- 모든 iterable은 Spread가 될 수 있음
- 순회가능한 데이터는 펼쳐 질 수 있음
func(...iterable)
[..iterable]
{...obj}

function add(num1, num2, num3){
return num1 + num2 + num3
}

add(10,20,30); // 일반적인 값

const nums = [10, 20, 30];
add(...nums) = add(nums[0], nums[1], nums[2])


구조분해할당
const fruits = [ '🍎', '🍊','🍓', '🍌' ];
const [fruit1, fruit2, ...others] = fruits;

const point = [1,2];
const [x, y, z=0] = point;
​
 
 
 
function add(num1, num2, num3){
    return num1 + num2 + num3;
}
 
 
function sum(num1,num2, ...nums){
    console.log(nums); //[ 3, 2, 5, 6, 7 ]
    // 앞에 두개는 이미 다른곳에
}
 
 
const nums = [10,20,30];
console.log(add(nums[0], nums[1], nums[2]))
console.log(add(...nums))
 
 
sum(1,2,3,2,5,6,7);
 
 
//배열(concat)
const fruits1 =['🍎', '🍊'];
const fruits2 =['🍓', '🍌'];
 
 
let arr = fruits1.concat(fruits2);
console.log(arr);
arr = [...fruits1,...fruits2];
console.log(arr);
 
 
// fruits1과 fruits2  사이에 😈를 넣어보자
arr = [...fruits1, '😈' ,...fruits2];
console.log(arr);
 
 
// 객체(object)
const apple = {name :'김사과', age:20, address: {si : 'seoul'} };
console.log(apple);
// apple.job = '프로그래머';
const apple_update ={...apple, job : '프로그래머'};
console.log(apple_update);
 
 
console.log('--------------------');
 
// 구조분해
const fruits = [ '🍎', '🍊','🍓', '🍌' ];
const [fruit1, fruit2, ...others] = fruits;
console.log(fruit1)// 🍎
console.log(fruit2)// 🍊
console.log(others)// [ '🍓', '🍌' ] 남은 나머지는 배열로 저장된다.

 

const point = [1,2];
const [x,y,z=0] = point;
console.log(x) // 1
console.log(y) // 2
console.log(z) // 0 -undefined가 나오는게 싫어서 z=0을 초기 선언

 

function sendEmoji(){
    return [ '🍎', '🍊','🍓', '🍌' ];
}
 
const [berry,apple2,banana,orange] = sendEmoji();
 
console.log(berry)  //🍎
console.log(apple2) //🍊
console.log(banana) //🍓
console.log(orange) //🍌
 
console.log('--------------------');

 

console.log(apple_update);
 
// function display(apple){
//     console.log('이름', apple.name)
//     console.log('나이', apple.age)
//     console.log('직업', apple.job)
// }

 

function display({name, age, job}){
    console.log('이름', name)
    console.log('나이', age)
    console.log('직업', job)
}
 
display(apple_update);
 
const {name, age, pet='루시', job: hobby} = apple_update;
console.log(name);
console.log(age);
console.log(pet);
console.log(hobby);

문제
const component = {
name : 'Button',
style : {
size :20,
color : 'black'
}
};

function changeColor(){
console.log(color);
}

changeColor(component)'​


const component = {
    name : 'Button',
    style : {
        size :20,
        color : 'black'
    }
};
// 두 가지 방법

function changeColor({style : {color}}){
    console.log(color);
}


// function changeColor(component){
//     console.log(component.style.color);
// }

changeColor(component)





반응형