수업

웹프로그래밍 - 자바스크립트 javascript 기초

eunslog 2023. 4. 4. 14:49
JavaScript 기초

 

자바스크립트
- 웹 브라우저를 프로그래밍적으로 제어하기 위해 사용되는 언어
- 웹 페이지를 동적으로 동작(or interaction) 시키기 위해 사용하는 언어

자바스크립트는 자바와 관련 없음!

 

자바스크립트 구성요소

-ECMAScript
자바스크립트의 기본 문법, 데이터 타입, 제어문, 반목문, 함수, 기본 라이브러리와 같은 프로그래밍적 요소
node js를 이용한 서버 개발의 기본 지식
 
-DOM(Document Object Model)
HTML, XML과 같은 구조화된 문서의 프로그래밍 interface
웹 페이지를 수정하거나 생성하는데 사용되는 모든 property, method, event 들이 objects 로 구성
 
-BOM(Browser Object Model)
BOM(Browser Object Model)은 브라우저 창에 접근하고 조작할 수 있게 하는 인터페이스

 

DOM

- 웹페이지를 자바스크립트로 제어하기 위한 객체 모델

- language-independent interface

- 웹 페이지가 load되면 브라우저는 웹 페이지의 DOM을 생성

https://www.freecodecamp.org/news/what-is-the-dom-document-object-model-meaning-in-javascript/

 

 

<script> 태그 위치
  • CSS를 style태그를 이용하여 정의하거나 .css 외부파일로 정의하는 방법이 있듯이, js를 html 문서상에서 script 태그 안에 정의하거나 .js 외부 파일로 분리하는 방법  존재
- 브라우저의 동작 방식
-> HTML을 읽기 시작
-> HTML을 파싱
-> DOM 트리를 생성
-> Render 트리(DOM tree + CSSCSSOM 트리 결합)가 생성
-> 화면에 표시(painting)

 

  • HTML 태그들을 읽어나가는 도중 <script> 태그를 만나면 파싱을 중단하고 javascript 파일을 서버에서 다운로드 후 javascript 코드를 파싱
  • 완료되면 그 후에 HTML 파싱이 계속

 

- body 태그 최하단이 가장 좋은 이유(HTML태그들 사이에 script 태그가 위치하면 안되는 이유)
   - js실행으로 인해 painting이 지연됨
   - DOM 트리가 생성되기 전에 jsDOM 조작 시도
   - 결론 à  body 태그 최하단에 위치하는 게 가장 좋음
   - 그러나 파일을 분리하는 것이 바람직

 

  • async, defer

  • async사용
1.script 로드와 html parsing이 함께 이루어짐
2.중단기간이 상대적으로 짧음
3.js가 여러 개이면서 서로 간에 실행 순서가 중요하다면 문제 발생 가능(fetching이후 곧바로 실행, 정의한 순서대로 실행되지 않을 수 있음)

 

  • defer사용
1. html parsing이 끝나고 난 뒤에야 script가 실행
2.js를 전부 받은 후 실행하므로 정의한 순서대로 js실행
 

 

데이터의 종류

 

  • 변수와 상수

- 변수 : 저장된 값이 변할 수 있음.

- 상수 : 저장된 값이 변할 수 없음.

- 변수 선언 방법: var, let, const

 

- let과 const 차이

종류 재선언 재할당
var O O
let X O
const X X

결론: 될 수 있으면 변수보다 상수 사용.

 

Scope(변수가 유효한 범위)

 

var 는 function scope
더보기
function scope: 함수 안에서 선언된 변수는 함수 안에서만 유효하며 함수 외부에서 참조 불가
let const 는 block scope

 

 

데이터의 종류
  • 데이터 타입

 

 

  • 리터럴(literal)
- 값을 프로그램 안에서 직접 지정한다는 의미
- 변수에 할당되는 값 그 자체 -> 문자 그대로(literally) 스크립트에 값을 제공
ex)
const number = 20;
const bool = true;

 

  • 원시 타입(primitive type)

- 모든 원시 값은 불변이다. 추적이 안된다.

- Boolean 타입
  - Boolean 은 논리적인 요소를 나타내고, true false 의 두 가지 값을 가질 수 있음
  - truefalse에 문자열처럼 따옴표 쓰지 않도록 조심
- Null 타입
  - Null 타입은 딱 한 가지 값, null 을 가질 수 있음
  - 변수에 무언가 할당을 했지만 그 값은 비어 있는 것
- Undefined 타입
  - 값을 할당하지 않은 변수는 undefined 값을 가짐
  - 선언된 변수지만 값 할당이 없는 것
- nullundefined는 다르지만 동등 연산자(==)는 둘을 같은 것으로 간주(c.f., 일치 연산자 ===)
같은 것으로 간주함.
일치하지는 않음.
 
- 변수의 값을 아직 모르거나 적용할 수 없는 경우에는 대부분 null을 사용

 

- Number
  - 부동 소수점 형식을 사용함.
  - NaN(Not a Number) : 숫자가 아님을 나타내는 값.
 
- String
  - 이스케이프
 
  - 문자열 템플릿: 변수를 포함하는 문자열

 

 -String(문자열 병합)

  - 덧셈과 병합은 모두 왼쪽에서 오른쪽으로 평가

  ex) 3+6+"9" => 99

      +x -> cast to Number

      "" + x -> cast to String

      !!x -> cast to Boolean

 

  • 연산자
비교 연산자
 - 동등(==): 두 피연산자의 값이 서로 같으면 true를 반환
 - 일치(===): 두 피연산자의 값과 타입이 모두 같은 경우 true를 반환
조건 (삼항) 연산자(ternary operator)
  - ReactJSX문법에서는 ifswitch문으로 처리가 불가능 -> 삼항 연산자가 대체
 

 


 

객체
  • Object
 - key: value pair 의 모음
 - JavaScript에서 가장 많이 사용되는 자료형
 - 최근 데이터 표현 표준으로 인식되는 JSON과 유사
 - key는 문자열이지만 value는 어떤 타입이어도 상관 없음
 - 빈 객체를 만드는 두 가지 방법

 

- 내장객체, 문서 객체 모델, 브라우저 객체 모델 존재

 

  • 속성(properties)
 - key: value" pair
번째 속성은 키는 "name", 값이 "john"
번째 속성은 키는 "age", 값이 30
키는 문자열이지만 따옴표를 생략 가능(스페이스, 특수문자의 경우 ""(따옴표) 필요)
 

 

  • 유용한 유틸

- 객체에 포함된 property 개수 세기(length)

-> Object.keys: 검사대상 객체를 전달

ex) Object.keys(car).length

 

-변수 타입 확인(typeof)

typeof list

typeof count

 

 

  • Object 객체

:자바스크립트의 최상위 객체

더보기

참고) 객체지향

 

- 자바스크립트는 프로토타입 기반 객체지향 언어

  -자바스크립트에는 클래스가 없음.(다만 일반적인 클래스처럼 작성할 수 있는 문법이 있음)

- 상속을 구현하는 두 가지 방법 : 프로토타입, 클래스

 

참고) 프로토타입

더보기
- 객체를 정의하면 사용자가 정의하지 않더라도 정의한 객체에 prototype이라는 속성(객체)가 생김
- prototype객체에 새로운 property를 등록하면 생성자 함수를 통해 생성된 모든 객체(인스턴스)는 등록된 프로퍼티를 사용할 수 있음.
- 생성자에서 정의한 프로퍼티는 인스턴스에서 보이지만 prototype에 정의한 프로퍼티는 인스턴스에서 바로 보이지 않음: joon에서 age가 보이지 않으면 그 부모 객체에 있는지 확인(look up)

 

  • Number 객체

- 원시 타입 number를 다룰 때 유용한 property와 메서드를 제공하는 래퍼(wrapper) 객체

  • Auto Boxing

- String, Number, Boolean new 키워드를 사용하지 않아도 원시 타입이면서 객체처럼 동작

- Auto Boxing: 원시 타입의 속성이나 메서드에 접근할 경우 원시 값(String, Number, Boolean)이 객체에 자동으로 감싸짐
 
.
.
String 객체 생략

 

  • Date 객체

- getTime() 함수

var now = new Date();
var after = new Date("May 5, 2023");

var interval = after.getTime() - now.getTime();
interval = Math.floor(interval / (1000 * 60 * 60 * 24));

alert("Interval: " + interval + "일");

 

참고 User strict mode

더보기
암묵적인 느슨한 모드를 해제하고 명시적인 엄격 모드를 사용
보다 엄격한 parsing error handling을 자발적으로 시행
 
사용 방법 : "use strict"을 js파일 맨 위에 적어줌.

 

 

  • 단축평가

- 논리연산은 왼쪽부터 오른쪽으로 진행하는데 이미 그 결과가 결정되었다면 끝까지 보지 않고 결정된 결과를 선택

 

 

-단축평가 사용x

 

-단축평가 사용