I_TStory/lecture

[JS] 개념정리 및 실습코드

귤치 2022. 7. 28. 16:41

강의하면서 준비했던 자료들입니다 

실습 코드는 여기에서 확인하세요 :-)

https://github.com/gyulch/lecture_frontend/tree/master/03_js

 

GitHub - gyulch/lecture_frontend: html, css, js, webgame

html, css, js, webgame. Contribute to gyulch/lecture_frontend development by creating an account on GitHub.

github.com

 


변수 선언

  • letconst, 그리고 var ?!
let name;     // 변수 선언
name = "홍길동";  // 변수 할당

let name = "홍길동";

const age = 27;
age = 26    // 에러
  • 변수 한 번에 할당
const name = "길동", gender = "m", age = 27;

데이터타입

✒️ 문자에만 “” 넣어서 문자열임을 알려주면 됨

(js는 java와 다르게 따로 타입 표기를 하지 않아요)

JAVA

Int num = 27;

double num = 27.7;

String name = “길동”;

JS

let num = 27;

let num = 27.7;

const name = “길동";

변수

  • 사용가능 변수 : age, age27, age_27, age
  • 사용불가 변수 : 27age, my age, ~age, class
  • 사용불가 예약어

💻 variable.html

— 스코프: 변수에 접근할 수 있는 범위

  • var : 함수스코프
  • let, const : 블록스코프

💥 핵심내용: 변수 선언 할 때는 let 또는 const로.

                변하는 값은 let, 불변값은 const 

                문자열 타입만 따옴표를 붙임

자바스크립트 데이터타입

산술 연산자

// 사칙연산
+, -, *, /, %, ** 

// 증가연산자 ++
let a = 3;
const b = ++a;

// expected output: "a:4, b:4"

let x = 3;
const y = x++; // x를 먼저 y에 넣고, x를 1 증가시킴

// expected output: "x:4, y:3"

//감소 연산자
let x = 3;
const y = x--;

// expected output: "x:2, y:3"

let a = 3;
const b = --a;

// expected output: "a:2, b:2"

Q. let a = 10;
   let b = a++ + 5;
   a와 b의 값 예상해보기

서로 다른 타입의 데이터를 사칙연산하면?

// 숫자 + 숫자
1 + 2 // 3
  
// 문자 + 문자 => 문자
"홍" + "길동" // "홍길동"

// Boolean + 숫자 
true + 1 // 2

// Boolean + Boolean
false + false // 0

// 문자 + 숫자 
"1"+ 6 //문자

// 더하기를 제외한 나머지 연산
"1" * 6 // 숫자
"길동" * 1 // NaN

+ 번외1
// js 내장함수 : isNaN()
isNaN(3) //false
isNaN("3") //false
isNaN("홍길동") //true

+ 번외2
1/0   // 연산 불가능 => Infinity

+ 번외3
// 문자열 비교할 때 아스키값을 비교함
"hi" > "Hi" //true (소문자 아스키값 > 대문자 아스키값)

할당 연산자

=, +=, -=, *=, /=, %=

let num = 3;

num = num + 10;
num += 10;

비교 연산자

==, ===

console.log(1=='1');   //true
console.log(1==='1');   //false. 
- 데이터형까지 같은 경우에 true로 판단

console.log(null == undefined);   //true
console.log(null === undefined);  //false
console.log(true == 1);           //true
console.log(true === 1);          //false
console.log(true == '1');         //true
console.log(true === '1');        //false

!=, !==
console.log(1 != '1')  //false
console.log(1 !== '1')  // true

<, <=, >, >=
console.log(1 < 2) //true
console.log(1 <= 1) //true  

논리 연산자

배열

	const arr = ["길동", "주혁", "태양", "미소"]
	
	// new Array함수를 통한 객체 생성
	const arr1 = new Array(1,2,3)
	const arr2 = new Array(3) // 배열길이 지정

- 배열의 index 알아보기
- 배열의 length 알아보기
  • Array 객체의 메서드
  • Array 메서드 더 알아보기

Array - JavaScript | MDN

객체

// 객체 (key 와 value로 이루어진 형태)
	const obj = {
		name: "길동",
	  age: 30,
	  gender: "m"
	}
	
	// 객체의 value 값에 배열 또는 함수 넣기도 가능 :-)
	const obj = {
	  name: "짱구",
		toDo: ["잠자기", "놀기", "먹기"],
	  say: function() {    //객체 안 프로퍼티로 정의된 함수: 메소드
	    alert('안녕, 나는 짱구야!');
		}
	}
	
	// 배열 안에 객체 넣기 
	  1. 이름이 태양인 학생의 객체를 콘솔에 출력해보세요
	  2. 상미의 나이를 콘솔에 출력해보세요
	const studentObj = [
		{
			name: "길동",
		  age: 17,
		  gender: "m"
		},
		{
			name: "태양",
		  age: 29,
		  gender: "m"
		},
		{
			name: "상미",
		  age: 18,
		  gender: "w"
		}
	]

api response example:

✒️ 객체 값에 객체 또 넣기 가능 :-)

🧑🏻‍🏫 값 꺼내오기 연습 : console에 “홍길동" 이 찍히도록

name 값을 출력해보세요
const obj = {
            "user": {
                "title": "UserBasicDetails",
                "type": "object",
                "properties": {
                    "name": {
                    "example": "Tony Stark",
                    "type": "string"
                    },
                    "gender": {
                    "example": "Male",
                    "type": "string"
                    }
                },
                "required": [
                    {
                        "name": "홍길동"
                    },
                    {
                        "gender": "m"
                    }
                ]
            }
        }

생성자 함수를 이용한 객체 생성 방식

// 객체: 틀 
// 인스턴스: 만든 틀을 기반으로 같은 모양으로 찍어내는 것  

// 생성자 함수
function Person(name, age) {
		// 생성자 함수 내부의 this는 생성자 함수가 생성할 인스턴스를 가리킨다.
    this.name = name;
    this.age = age;
    this.personInfo = function() {
        console.log(`이름: ${this.name}, 나이: ${this.age}세`)
    }
}

// 인스턴스 생성
const person1 = new Person('미미', 23); 
const person2 = new Person('동건', 40);
console.log(person1)
console.log(person2.personInfo())

Date, Math 객체 _ time.html

// new Date()
getMonth();
getDate();
getHours();

// Math
Math.PI
Math.round(2.3); // 가까운 정수로 반올림
Math.pow(2,3); // 2의 3제곱
Math.sqrt(4) // 4의 제곱근 반환
Math.abs(-4) // 절댓값 반환
Math.ceil(3.7) // 소수 첫째 자리 올림
Math.floor(3.7) // 소수 첫째 자리 내림  
Math.max(1,2,4,19,-6) // 최댓값 반환
Math.min(1,2,4,19,-16) //최솟값 반환
Math.random() // 0-1사이의 난수

- 0부터 100사이의 난수 만들기
Math.floor(Math.random()*100)

조건문 (if-else, switch)

// if 문
if(3 === '3') {
    console.log('@')
} else if(names[0] == "영희") {
    console.log('@')
} else if (3 == '3') {
    console.log('true 입니다.')
} else {
    console.log('else!')
}

// switch 문
switch(식) {
	case 값: 실행문;
		break;
	case 값: 실행문;
		break;
	case 값: 실행문;
		break;
	defaul: 실행문;
}

반복문 (for)

// 👾 for 문

// 0부터 5까지 출력해보자
for(let i=0; i <= 5; i++) {
	console.log(i)
}  
- for문 실행순서: 초깃값 -> 조건 -> 블록 안 코드 -> 증감식 

// for 반목문으로 배열에 있는 값을 순서대로 출력해보자
const names = ["철수","영희","길동","짱구","흰둥이"]

for(let i=0; i<names.length; i++) {
    console.log(i + ":" + names[i])
    console.log(`${i}번째 인덱스를 가진 사람은 ${names[i]}입니다.`);
}

반복문 (while, do-while)

// 👾 while 문 (0부터 10까지의 수를 짝수만 출력되게 해보자)

let num = 0;

while(num <=10) {
  if(num % 2 === 0) {
      console.log(num);
  }  
  num ++;
}

// 👾 do while 문
do {
	실행할 명령
} while (조건)
=> 일단 명령 한 번 실행 후 조건 체크.

alert(), confirm(), prompt()

alert.html
// propmt로 사용자 값을 입력 받아 alert으로 결과값을 알려주는 코드를 작성해보세요
// switch 문 사용
const study = prompt('수업을 입력하세요(html, css, js, react)')

switch(study) {
    case 'html' : 
        alert('html 수업은 1주차 강의입니다.');
        break;
    case 'css' : 
				alert('css 수업은 2주차 강의입니다.');
        break;
    case 'js' : 
				alert('js 수업은 3주차 강의입니다.');
        break;
    case 'react' : 
        alert('react 강의는 8월초에 진행합니다.');
        break;
    default: alert('예정되지 않은 강의입니다.');
}

👾 switch -> if, else 로 바꿔보세요 (7월강의와 8월강의를 구분해서 결과값을 띄워주세요)

+ 번외: propmpt() 로 사용자에게 입력받은 값은 "문자열"로 저장이 됩니다.
  따라서 숫자를 받는 경우라면 parseInt() 함수를 사용해요
  parseInt() : 괄호 안의 값을 정수로 변환 (실수 -> 정수로 변환할 때도 쓰여요!)

ex) parseInt(prompt("숫자를 입력하세요"));

삼항 조건 연산자

// 조건식 ? 실행문1 : 실행문2;
// 사용자에게 받은 값이 짝수인지 홀수인지 확인하는 코드
👾 if, else 를 '삼항연산자' 로 바꿔보세요

const num = prompt('숫자를 입력하세요')

if(num !== null) {
	**if(num % 2 === 0)
		alert("짝수입니다 ✌🏻");
	else 
		alert("홀수입니다 ☝🏻");**
} else {
	alert("사용자가 취소버튼누름");
}

함수

 - 함수선언
function 함수명() {
		// 실행코드
    return;   // 함수 종료
}
 - 함수호출
함수명();

// 파라미터 1,2를 받아 두 인자를 더해 리턴하는 함수를 구현해보세요.

// 이름과 나이를 받아 console에 출력하는 함수를 구현해보세요.

// return : 함수종료
  • 함수 선언 방식
// 함수 선언문
function addHandler(a, b) {
    console.log('함수 선언문')
}

// 함수 표현식(익명함수를 변수에 할당)
const addHandler = function() {
	console.log('함수 표현식')
}

// arrow_화살표 함수 (es6)
const addHandler = (a, b) => a + b;

// 즉시실행함수
(function(){
    console.log('즉시실행')
}());

  • 매개변수 기본값 설정 (es6)
const addFunc = (a, b=10) => {
    return a + b;
}

console.log(addFunc(5,3))
console.log(addFunc(3))

👾 전역변수와 지역변수 값 예측해보기

**const num = "나는 전역변수";** // 전역변수

const myFunc = () => {
    **const num = "나는 지역변수";** // 지역변수
    console.log("퀴즈1:", num);
}
myFunc();

console.log("퀴즈2:", num)

🧑🏻‍🏫 지역변수 num은 전역변수 num보다 우선순위를 가짐
  • 번외
웹브라우저에서 js를 해석할 때 함수 선언 부분을 가장 먼저함! (호이스팅)
그래서 함수 호출 후 선언이 가능.

=> 함수 표현식은 안됨 (const 또는 let 변수에 함수를 할당하기 때문)

재귀함수

// 함수 안에서 자기 자신을 호출
const factorial = num => {
    if(num <= 0) {
        return 1;
    } 
    return num * factorial(num - 1);
}

const result = factorial(5);
console.log(result)

문자열 다루기

str.length : 문자열 길이 반환

📌 subString(🍊, 🍌) : 🍊인덱스부터 ~ 🍌 인덱스-1 까지 자름

let str = '반갑습니다아';

const result1 = str.substring(0, 2);
// "반갑"

const result2 = str.substring(2, 5);
// "습니다"

const result3 = str.substring(2);
// '습니다아'

📌 slice(🍊, 🍌) : subString 과 사용법 똑같음

단, slice는 음수 사용 가능( 뒤에서부터 자르기)

let str = '반갑습니다아';

const result1 = str.slice(-2);
// "다아"

const result2 = str.slice(-4, 5);
// "습니다"

📌  substr(🍊, 🍌) :

🍊인덱스부터 🍌 length 만큼 자름

let str = '반갑습니다아';

const result1 = str.substr(0, 2);
// '반갑'

const result2 = str.substr(2, 4);
// '습니다아'

const result3 = str.substr(2);
// "습니다아"

이벤트와 이벤트 처리기

  • 마우스 이벤트: 💻 event-mouse.html
  • 키보드 이벤트: 💻 event-keyboard.html
event.keyCode, event.which: 키보드 키코드값 반환
  • 인라인 함수 밖으로 빼보기
// onclick _ 💻 callback.html
document.querySelector('선택자').onclick = function() {
    this.style.backgroundColor = 'red'
}

// onload, onresize _ 💻 callback2.html
window.onresize = function() {
    console.log('크기변경됨')
    console.log(window.innerWidth)
}

돔 조작해보기 (선택자)

  • 💻 dom.html
HTML요소생성: createElement(), appendChild()

   const btn = document.createElement('button');
	 btn.onClick = function() {
		 alert('새로만든 버튼 클릭')
	 }
   const txt = document.createTextNode('버튼입니다');
  
   btn.appendChild(txt);
   document.body.appendChild(btn);

HTML요소제거: removeChild()
	const lists = document.querySelectorAll("mylist > li");
	
	for(let i=0; i<lists.length; i++) {
      lists[i].addEventListener('click', function() {
		    this.parentNode.removeChild(this);
      })
	}

HTML요소교체: replaceChild(newNode, oldNode)
	const ul = document.querySelector('ul')
	const lists = document.querySelectorAll("mylist > li");
	
  for(let i=0; i<lists.length; i++) {
		lists[i].addEventListener('click', function(idx) {
			const elem = document.createElement('li');
			const txt = document.createTextNode('새로운 목록'); 
			elem.appendChild(txt);

			ul.replaceChild(elem, this);
		})
	}

이벤트리스너

// addEventListener

addEventListener(이벤트, 함수)
- 이벤트: click, mouseover, mouseout
ex) tag.addEventListener('click', function() {
		   this.style.backgroundColor = 'green';
    })

JS로 form 제어하기

input.onfocus
input.onblur
input.ininput  :입력창에 입력할 때마다 발생
input.onsearch :입력 후 enter누를 때 발생
onchange : form-change.html
onreset:
onsubmit:


📌 번외, 참고 사이트

🧑🏻‍🏫 자바스크립트 작성 규칙

1. 들여쓰기 (html, css도 해당)
2. 세미콜론 (문장을 구분해줘야 디버깅 쉬움)
3. 한줄에 여러문장 작성금지 // let a = 0; let b = 1;
4. 연산자, 값 사이에 공백 넣기 // let sum = num + 10; 

🧑🏻‍🏫  자바스크립트 코딩 스타일 가이드 (코딩 컨벤션) 정의 사이트

(var 사용x, arrow 함수 사용권장, 템플릿 문자열 사용 권장(${} 등)

  • 구글 스타일가이드

styleguide/jsguide.html at gh-pages · google/styleguide

 

GitHub - google/styleguide: Style guides for Google-originated open-source projects

Style guides for Google-originated open-source projects - GitHub - google/styleguide: Style guides for Google-originated open-source projects

github.com

  • 에어비앤비 스타일가이드

https://github.com/airbnb/javascript

 

GitHub - airbnb/javascript: JavaScript Style Guide

JavaScript Style Guide. Contribute to airbnb/javascript development by creating an account on GitHub.

github.com