FrontEnd/JavaScript

#39. JavaScript(요소접근하기, 변수와자료형, 문자열과 숫자)

열하나요 2023. 8. 25. 13:59

39-1. 요소접근하기(가져오기)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>요소접근하기(가져오기)</title>
    <style>
        .area{
            width : 300px;
            height : 100px;
            border : 1px solid black;
        }
    </style>
</head>
<body>
    <h1> HTML 요소 접근하기 </h1>

    <h3> 1) 아이디속성값으로 접근하기 </h3>
    <div id="area" class="area"></div>
    <button onclick="accessId();">아이디로 접근</button> <!-- 함수 호출시 여러개를 같이 호출 가능, 세미콜론으로 구분  alert(1); alert(2);-->

    <script>
        function accessId(){
            // 아이디로 요소에 접근할 때 !
            // const 변수식별자 = document.getElementById('접근할 요소의 아이디 속성값');
            // 요소 객체라고 부른다.

            const area1 = document.getElementById('area');
            console.log(area1);
            console.dir(area1);

            // get / set
            // 선택된 요소의 속성들에 접근해서 값을 get하거나 set할 수 있음
            // 속성에 접근하려고 하면 ?? => 선택된요소객체.속성명

            // console.log(area1.id);

            area1.innerHTML = '아이디로 접근성공! <br>';
            
            console.log(area1.innerHTML);

            area1.innerHTML += '<mark>메롱메롱~</mark>';

            // 선택된 요소에 스타일 변경
            //area1.style = 'color : pink; width : 500px;';

            area1.style.backgroundColor = 'pink';
            area1.style.color = 'skyblue';
            area1.style.width = '100px';

            // 개발자 도구로 확인 시 인라인 방식으로 스타일이 부여된 것을 확인할 수 있음
        }
    </script>

    <br><br><br><br><br><br><br><br><br><br>

    <div id="area2" class="area" style="background:yellowgreen"></div>
    <button onclick="accessId2();">실습시간</button>

    <!-- 버튼을 클릭하면 div요소의 색상이 변경되도록 일곱빛깔 색깔돌리기 -->
    <script>
        function accessId2(){

            const area2 = document.getElementById('area2');

            if(area2.style.backgroundColor == 'yellowgreen'){
                area2.style.backgroundColor = 'orange';
            } else {
                if(area2.style.backgroundColor == 'orange') {
                    area2.style.backgroundColor = 'yellow';
            };
            };
        }


    </script>

    <hr>

    <h3> 2) 태그명으로 접근하기 </h3>

    <ul>
        <li>목록1</li>
        <li>목록2</li>
        <li>목록3</li>
        <li>목록4</li>
        <li>목록5</li>
    </ul>

    <button onclick="accessTagName();">태그명으로 접근</button>

    <script>
        function accessTagName(){

            // 태그 이름을 통해서 요소에 접근
            // document.getElementsByTagName('접근하고자 하는 태그명');
            // => 선택된 여러 개의 요소객체들이 배열에 담겨서 반환 
            // 자바스크립트에서 배열은 []로 표현

            const array = document.getElementsByTagName('li'); // [li요소객체1, li요소객체2, ...]
            
            console.log(array);
            console.log('배열의 크기 : ' + array.length);

            console.log(array[1]);
            // array[0].style.backgroundColor = 'rgb(0, 250, 250)';
            // array[1].style.backgroundColor = 'rgb(40, 250, 250)';
            // array[2].style.backgroundColor = 'rgb(80, 250, 250)';
            // array[3].style.backgroundColor = 'rgb(120, 250, 250)';
            // array[4].style.backgroundColor = 'rgb(160, 250, 250)';

            
            let redNum = 0;
            for(let i = 0; i < array.length; i++) {
                array[i].style.backgroundColor = 'rgb(' + redNum + ', 250, 250)';
                redNum +=40;
            }
        }
    </script>

    <hr>

    <h3> 3) name속성 값으로 접근하기 </h3>

    <form action="test.do">
        <fieldset>
            <legend>과일</legend>

            <input type="checkbox" name="fruit" value="딸기">딸기
            <input type="checkbox" name="fruit" value="수박">수박
            <input type="checkbox" name="fruit" value="멜론">멜론
            <input type="checkbox" name="fruit" value="블루베리">블루베리
            <input type="checkbox" name="fruit" value="포도">포도
            <input type="checkbox" name="fruit" value="사과">사과
            <input type="checkbox" name="fruit" value="윈터프린스">윈터프린스
        </fieldset>
    </form>

    <button onclick="accessName();">name속성으로 접근</button>

    <script>
        function accessName(){
            // name속성값으로 요소에 접근할 때
            // document.getElementsByName('접근하고자 하는 name속성값');
            // => 선택된 요소 객체들이 배열에 담겨서 반환

            const fruits = document.getElementsByName('fruit'); // [checkbox, checkbox2, ...]
            console.log(fruits);

            
            // if(fruits[0].checked){
            //    alert('1번 체크'); 
            // }
            

            console.log(fruits[0].value);

            var str = '';
            for(var i = 0; i < fruits.length; i++){
                if(fruits[i].checked){
                   // alert(fruits[i].value); 
                   str += fruits[i].value + ' ';
                }
            }

            alert(str);

            // 논리값

            // 자바에서의 논리값의 형태
            // boolean == true / false

            // 자바스크립트에서는 모든 값이 논리값으로 쓰일 수 있음
            // boolean == true / false
            // Falsy 거짓같은값 빼고 모두 참
            // 0, 0.0, '', "", null, undefined, NaN 빼고 모두 참
            // 값이 넘어올때 null값 등이 나오면 false로 취급하니까 그런것 조심할것. 오타나도 undefined취급하니까 false로 됨 주의

            if([] == 0){
                alert('난 트루값이야');
            }

            let chk;
            if(chk){
                alert('난 undefined야');
            }
        }
    </script>

    <hr>

    <h4> 4) 클래스 속성명으로 접근하기 </h4>

    <div class="test"></div>
    <p class="test"></p>
    <ul class="test">
        <li></li>
        <li></li>
    </ul>
    <pre class="test"></pre>

    <button onclick="accessClass();">class로 접근</button>

    <script>
        function accessClass(){

            // class속성값으로 요소를 가져올 때
            // document.getElementsByClassName('접근하고자 하는 class속성값');
            // => 선택된 요소들이 배열에 담겨 반환

            console.log(document.getElementsByClassName('test'));
        }
    </script>

</body>
</html>

 

39-2. 변수와 자료형

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>변수와 자료형</title>
</head>
<body>

    <h1>변수와 자료형</h1>

    <!-- var, let, const -->
    <h2>변수 선언 시 var뿐만 아니라 let, const를 이용해서 선언 가능</h2>
    <h3>* var, let, const 차이점</h3>

    <h4> 1) 변수 선언 방법</h4>
    <button onclick="defDeclare();">나는 변수 선언 버튼이야 ~ </button>


    <h4> 2) scope(사용가능 범위)</h4>
    <button onclick="defScope();">요건 클릭이야~</button>
    






    <script>
        function defDeclare(){

            // 1) var는 중복선언이 가능하다. / 재할당도 가능하다.
            var userId = 'user01';
            console.log(userId);

            var userId = 'user02';
            console.log(userId);

            userId = 'user03';
            console.log(userId);

            console.log('------------------------------------');

            // 2) let은 중복선언이 불가능하다. / 재할당은 가능하다.

            let userPwd = 'pass01';
            console.log(userPwd);

            /*
            let userPwd = 'pass02';
            console.log(userPwd);
            */

            userPwd = 'pass03'; // 재할당은 가능
            console.log(userPwd);

            console.log('------------------------------------');

            // 3) const는 중복선언이 불가능하다. // 재할당도 불가능하다.(상수같은 개념 == 한 번 초기화된 값 변경X)

            const userName = '홍길동';
            console.log(userName);

            /*
            const userName = '김철수';
            console.log(userName);
            */

            /*
            userName = '김나나';
            console.log(userName);
            */
            
            // var는 자유롭게 변수 선언 !! 사용할 수 있다는 장점이 있음
            // 중복된 변수명이 남발 / 의도치 않게 값이 변경
            // 위험한 단점
            // => 보안해서 나온게 let, const

            // 권장사항 : let, const위주로 사용~~
        }

        function defScope(){

            // 1) var는 functionScope == 변수가 선언된 "함수영역" 내에서 사용 가능

            var name = '홍길동';
            console.log(name);

            for(var i = 0; i < 10; i++){

            }
            console.log(i);

            if(true){
                var age = 20;
            }
            console.log(age);
            // scopeTest();

            // 2) let, const는 blockScope == 변수가 선언된 블럭()내에서만 사용 가능 

            if(true){
                let gender = 'M';
                const hobby = '안경쓰기';
            }

            console.log(gender);
            console.log(hobby);
        }
    </script>

    <hr>

    <h3>* 변수 선언 위치에 따른 전역변수 / 지역변수 </h3>

    <pre>
        &lt;script&gt;
            var 변수명;
            변수명;

            function(){
                var 변수명;
                변수명;
            }
        &lt;/script&gt;
    </pre>

    <script>
        // 전역변수들 
        str = '전역변수';
        var str2 = 'var전역변수';

        // window.onload = 현재 이 HTML문서가 전부 다 로딩되고나서
        // 곧바로 실행할 익명함수를 대입
        window.onload = function(){

            var str = '지역변수'; // 전역변수명과 중복
            var str3 = '새로운 지역변수';
            str4 = '내가누구게??';

            console.log('------- str -------');
            console.log(str); // 지역변수명과 전역변수명이 동일하다면 지역변수 호출
            // 전역변수에 접근하고자 한다면?? => window.전역변수명 또는 this.전역변수명
            console.log(window.str);
            console.log(this.str);

            console.log('------- str2 -------');
            console.log(str2);
            console.log(window.str2);
            console.log(this.str2);

            console.log('-------- str3 --------');
            console.log(str3);
            console.log(window.str3); // undefined(정의되어있지않음)
            console.log(this.str3);

            console.log('--------- str4 ---------');
            console.log(str4);
            console.log(window.str4);
            console.log(this.str4);
            // Scope안에서 변수 선언시 var를 생략할 경우 전역변수로 취급됨
        }
    </script>

    <hr>

    <h3>* 자료형 </h3>
    <p>
        변수 선언 시 자료형을 별도로 지정하지 않음(자료형의 개념이 없는 건 아님) <br>
        => 변수에 대입되는 값에 따라서 알아서 자료형이 자동으로 결정됨 : 타입추론
    </p>

    <h4>자바스크립트의 자료형</h4>
    <ul>
        <li>string(문자열)</li>
        <li>number(숫자)</li>
        <li>boolean(논리값)</li>
        <li>object(객체)</li>
        <li>function(함수)</li>
        <li>undefined(초기화가 아직 진행되지 않은 변수)</li>
    </ul>

    <button onclick="typeTest();">자료형 테스트</button>
    <div id="area" style="border:1px solid black"></div>

    <script>
        function typeTest(){

            const name = '퀸갓혜림';

            const age = 20;

            const flag = true;

            const hobby = ['집에 누워있기', '잠자기'];

            const user = {
                userId : 'queen',
                userPwd : '010101'
            };

            const testFn = function(){
                alert('머시기머시기');
            };

            let noVal;

            // 실습
            const divEl = document.getElementById('area')
            divEl.innerHTML = name + '<br>';
            divEl.innerHTML += age + '<br>';
            divEl.innerHTML += flag + '<br>';
            divEl.innerHTML += hobby + '<br>';
            divEl.innerHTML += user + '<br>';
            divEl.innerHTML += testFn + '<br>';
            divEl.innerHTML += noVal + '<br><hr>';

            // 자료형 찍어보기
            // 자료형을 확인할 때 필요한 함수 : typeof(변수명);
            divEl.innerHTML += typeof(name) + '<br>';
            divEl.innerHTML += typeof(age) + '<br>';
            divEl.innerHTML += typeof(flag) + '<br>';
            divEl.innerHTML += typeof(hobby) + '<br>'; // 배열은 자바스크립트에서 객체! objecttype
            divEl.innerHTML += typeof(user) + '<br>';
            divEl.innerHTML += typeof(testFn) + '<br>';
            divEl.innerHTML += typeof(noVal) + '<br><hr>';
        }
    </script>
    
</body>
</html>

 

39-3. 문자열과 숫자

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>문자열과 숫자</title>
    <style>
        .area{
            width : 300px;
            border : 1px solid orangered;
        }

        .big{height : 450px;}
        .small{height : 200px;}
    </style>
</head>
<body>

    <h1>문자열과 숫자</h1>

    <h3>* 문자열과 관련된 메소드</h3>

    <button onclick="showStringMethod();">문자열 처리 메소드</button>
    <div id="area1" class="area big"></div>


    <script>
        function showStringMethod(){

            let str1 = 'Hello World!';

            const area1 = document.getElementById('area1')
            area1.innerHTML = 'str1 : ' + str1 + '<br>';
            area1.innerHTML += '문자열의 길이 : ' + str1.length + '<br>';
            area1.innerHTML += 'toUpperCase() : ' + str1.toUpperCase() + '<br>';
            area1.innerHTML += 'toLowerCase() : ' + str1.toLowerCase() + '<br>';
            
            // str1에 대입되어있는 문자열을 출력
            // 0번째 인덱스 H
            // 1번째 인덱스 e
            // 2번째 인덱스 l
            // ....
            // 11번째 인덱스 !

            /* 자바라면?
            for(int i = 0; i < str.length; i++){
                System.out.println(i + "번째 인덱스 " + str.charAt(i)));
            }
            */
            for(let i = 0; i < str1.length; i++){
                area1.innerHTML += i + '번째 인덱스 ' + str1.charAt(i) + '<br>';
            }

            // string의 인덱스 찾기
            area1.innerHTML += '앞에서부터 첫 l의 위치(인덱스) : ' + str1.indexOf('l') + '<br>';
            area1.innerHTML += '뒤에서부터 첫 l의 위치(인덱스) : ' + str1.lastIndexOf('l') + '<br>';
            area1.innerHTML += '앞에서부터 첫 a의 위치(인덱스) : ' + str1.indexOf('a') + '<br>';
            // 해당 문자가 존재하지 않을 경우에는 -1을 반환

            area1.innerHTML += 'substring(시작인덱스) : ' + str1.substring(6) + '<br>';
            area1.innerHTML += 'substring(시작인덱스, 끝인덱스) : ' + str1.substring(3, 7) + '<br>';
            
            var str2 = '국밥,순두부찌개,초밥';
            const lunchMenu = str2.split(',');

            area1.innerHTML += 'lunchMenu : ' + lunchMenu + '<br>';
            area1.innerHTML += 'lunchMenu의 자료형 : ' + typeof(lunchMenu); // 배열형!


        }
    </script>

    <h3>* 숫자(수학)관련 메소드</h3>

    <button onclick="showMathMethod();">수학관련메소드</button>
    <div id="area2" class="area small"></div>

    <script>
        function showMathMethod(){

            const area2 = document.getElementById('area2');

            // Math 내장 객제 제공(Math.메소드명())
            area2.innerHTML = '절대값 : ' + Math.abs(-123) + '<br>';
            area2.innerHTML += '랜덤값 : ' + Math.random() + '<br>';
            area2.innerHTML += '반올림 : ' + Math.round(123.456) + '<br>';
            area2.innerHTML += '버림 : ' + Math.floor(123.999) + '<br>';
            area2.innerHTML += '올림 : ' + Math.ceil(123.1231) + '<br>';
        }
    </script>

    <hr>

    <h3>* 다른 자료형들끼리 산술연산</h3>

    <button onclick="arithmetic();">산술연산</button>
    <div id="area3" class="area big"></div>

    <script>
        function arithmetic(){

            // 덧셈연산
            let test1 = 7 + 7; // 14
            let test2 = 7 + '7'; // 77
            let test3 = '7' + 7; // 77
            let test4 = 7 + 7 + '7'; // 147
            // let test5 = '7' + 7 + 7; // 777

            var area3 = document.getElementById('area3');
            area3.innerHTML += 'test1 : ' + test1 + '<br>';
            area3.innerHTML += 'test2 : ' + test2 + '<br>';
            area3.innerHTML += 'test3 : ' + test3 + '<br>';
            area3.innerHTML += 'test4 : ' + test4 + '<br>';
            // area3.innerHTML += 'test5 : ' + test5 + '<br>';
            
            // 나머지 산술연산
            // 문자열이 숫자로 자동형변환된 후 산술연산 진행
            // 단, 이 때 문자열이 반드시 숫자로 존재해야함!!
            // => 숫자가 아닌 문자가 포함될 경우 NaN(Not a Number)

            let test5 = '7' - 7; // 0
            let test6 = '7' * 7; // 49
            let test7 = '7' / 7; // 1
            let test8 = 'a' - 7; // NaN

            area3.innerHTML += 'test5 : ' + test5 + '<br>';
            area3.innerHTML += 'test6 : ' + test6 + '<br>';
            area3.innerHTML += 'test7 : ' + test7 + '<br>';
            area3.innerHTML += 'test8 : ' + test8 + '<br>';

            // 강제형변환(문자열 ==> 숫자)
            // Number(문자열)
            // parseInt(문자열)
            // parseFloat(문자열)

            let iNum = 2; // number
            let sNum = '3'; // string

            let test9 = iNum + sNum; // 2+'3' -> '23'
            let test10 = iNum + Number(sNum); // 5
            let test11 = iNum + parseInt(sNum); // 5
            let test12 = iNum + parseFloat(sNum); // 5

            area3.innerHTML += 'test9 : ' + test9 + '<br>';
            area3.innerHTML += 'test10 : ' + test10 + '<br>';
            area3.innerHTML += 'test11 : ' + test11 + '<br>';
            area3.innerHTML += 'test12 : ' + test12 + '<br>';

            // parseInt vs parseFloat
            let fNum = '1.234';

            let test13 = iNum + fNum; // 2 + '1.234' => '21.234'
            let test14 = iNum + Number(fNum); // 숫자계산이 아주 잘됨~ => 3.234
            let test15 = iNum + parseInt(fNum); // '1.234' => 1(버림)
            let test16 = iNum + parseFloat(fNum); // '1.234' => 실수로 변경

            area3.innerHTML += 'test13 : ' + test13 + '<br>';
            area3.innerHTML += 'test14 : ' + test14 + '<br>';
            area3.innerHTML += 'test15 : ' + test15 + '<br>';
            area3.innerHTML += 'test16 : ' + test16 + '<br>';



            // var price = '1000원'
            // parseInt(price) : 1000 // 숫자인 부분까지만 저장
            // Number(price) : NaN이 저장됨
        }
    </script>

    <hr>

    <h3>☆ 간단한 문제 ★</h3>
    <fieldset id="fs">
        <legend>문제!</legend>
        <h3></h3>
        <input type="text" name="test" id="test">
        <button onclick="test();">정답은?!?!</button>

    </fieldset>

    <script>
        function test(){
            const it = document.getElementById('test');
            var itValue = it.value;

            // console.log(typeof(itValue));

            // '7' / '7' => 1
            // '7' * 0 => 0
            // 'a' * 0 => NaN
            // 'a' * 'a' => NaN
            // Number(iValue)
            
            // isNaN(숫자) : NaN이라면(숫자가 아니라면) true, NaN이 아니라면 false

            if(isNaN(itValue)){
                alert('숫자가 아닙니다');
            } 
            else{
                alert('숫자입니다!');
            }
        }
    </script>

    <hr>

    <h3>덧셈 / 뺄셈 계산기</h3>

    정수1 : <input type="text" id="num1"> <br>
    정수2 : <input type="text" id="num2"> <br>

    <label id="result"></label> <br>
    <button onclick="plus();">덧셈</button> <br>
    <button onclick="minus();">뺄셈</button>

    <script>
        function plus(){

            let num1 = Number(document.getElementById('num1').value);
            let num2 = Number(document.getElementById('num2').value);

            let result = document.getElementById('result');

            result.innerHTML = num1 + num2;
        }

        function minus(){

            let num1 = document.getElementById('num1').value;
            let num2 = document.getElementById('num2').value;

            document.getElementById('result').innerHTML = '결과 : ' + (num1 - num2);
        }
    </script>

</body>
</html>