반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- ip
- 쉬운 문제
- 알고리즘
- 그래프
- typescript
- Algorithm
- TCP
- javascript
- dp
- 자바스크립트
- type challenge
- 문자열
- 타입스크립트
- HTTP
- Nestjs
- Crawling
- dfs
- socket
- 레벨 1
- HTTP 완벽 가이드
- 소켓
- 크롤링
- 프로그래머스 레벨 2
- Node.js
- 프로그래머스
- 수학
- BFS
- 타입 챌린지
- 가천대
- 백준
Archives
- Today
- Total
kakasoo
[JavaScript] 자바스크립트 기초 체크 본문
반응형
프로그래밍 언어의 구분
- 컴파일 : 소스코드를 실행하기에 앞서 기계어로 번역하는 행위
- 컴파일러 : 컴파일을 수행하는 소프트웨어
- 인터프리터 언어 : 프로그램을 한 줄 마다 기계어로 번역하는 프로그래밍 언어
- 인터프리터 : 프로그램을 번역해서 실행시키는 소프트웨어
프로그래밍 언어의 유형
- 절차식 언어 : 절차를 순서대로 작성하는 언어
- 객체지향 언어 : 처리와 관련된 데이터를 하나로 묶어 객체 단위로 관리하는 언어
- 함수형 언어 : 프로그램을 함수를 조합하여 구현하는 언어
- 논리형 언어 : 데이터 사이의 관계와 논리를 설명해나가는 언어
자바스크립트의 특징
- 인터프리터 언어
- 웹 브라우저에는 자바스크립트 코드를 해석하는 JIT (Just In Time)컴파일러가 내장되어있다.
- 동적 프로토타입 기반 객체지향 언어이다. → 클래스가 아닌 프로토타입 기반이며, 객체가 생성된 후에도 프로토타입에 속성이나 메서드를 추가, 삭제할 수 있다.
- 동적 타입 언어이다 → 타입이 이후에도 바뀔 수 있는 언어이다.
- 함수가 일급 객체다. → 함수형 프로그래밍 가능
- 함수가 클로저를 정의한다 → 정의한다는 말이 어려울 수 있는데, 그냥 함수가 클로저를 만들어낼 수 있다고 생각하면 된다.
자바스크립트의 기술적 요소
- ECMAScript (코어 언어) : 자바스크립트의 코어에 해당하는 부분
- 클라이언트 측의 고유한 기술 요소
- Window 인터페이스 : browser 및 window를 조작하는 기능을 제공
- DOM : HTML 문서를 제어하는 기능을 제공
- XMLHttpRequest : 서버와 비동기로 통신하는 기능을 제공
- HTML5에 규정된 다양한 API를 사용할 수 있다.
- Drag and Drop
- Blob : 이진 데이터를 다루는 기능을 제공한다.
- File : 로컬 파일 시스템을 읽고 쓸 수 있는 기능을 제공한다.
- Web Workers : 프로그램 여러 개를 멀티스레드로 병렬 처리하는 기능을 제공한다.
- Web Storage : 대용량이며, 저장기간에 제한이 없는 데이터를 로컬에 저장하는 기능을 제공한다.
- Indexed Database : 로컬에 key-value 타입의 관계형 데이터베이스 기능을 제공한다.
- WebSockets : 서버와의 양방향 통신 기능을 제공한다.
- Geolocation : GPS 등의 위치 정보를 다루는 기능을 제공한다.
- Canvas : 2차원, 3차원 그래픽스 기능을 제공한다.
- 서버 측 자바스크립트의 고유한 기술 요소
- Node.js : 구글이 개발한 자바스크립트 실행환경 (다른 대체제도 있긴 하나, Node.js가 절대적인 위치에 있다.)
자바스크립트 프로그램 작성법
- 자바스크립트는 유니코드 문자로 작성한다. 따라서 한글이나 일본어 등 굳이 영어가 아니어도 사용할 수 있다.
- 자바스크립트는 대소문자를 구분한다.
- 자바스크립트는 구문을 모두 토큰으로 분해한 후 분석(파싱)한다. → (tokenizer → lexer → parsing)
- 토큰과 토큰 사이는 공백으로 구분된다.
- 구분자 ( 산술 연산자, 괄호, 쉼표와 콜론, 세미콜론, 마침표) 앞뒤의 공백문자는 생략할 수 있다.
- 빈문장 ( 세미콜론만 있는 경우 )이 필요한 경우도 있다. → 7장 참고
변수
- 변수를 초기화하지 않을 경우 변수의 값에는 undefined가 들어간다.
- 변수의 초기화는
var a = 1, b = 2, c = 3;
처럼 한 문장으로 표현할 수도 있다. - 선언자를 붙이지 않고 변수에 값을 대입한 경우 자바스크립트 엔진이 그 변수를
전역 변수
로 대신 선언해준다. → ECMAScript5 부터는 오류로 취급한다.
- 변수의 초기화는
- 변수 선언의 끌어올림 (호이스팅, hoisting)이 있다 (자바스크립트만의 고유한 특징)
- await, enum, implements, package, protected, interface, private, public은 ECMAScript6 이후에 추가될 것이기에, 아직은 예약어가 아니나 사용하지 않는 것이 좋다.
데이터 타입
- 동적 타입 언어 : 실행할 때에 변수에 저장된 데이터 타입을 동적으로 바꿀 수 있는 언어
자바스크립트의 데이터 타입
- 원시 타입 : 숫자, 문자열, 논리값, 특수한 값 (undefined, null)과 심벌
- 숫자
- 문자열
- 자바스크립트를 HTML의 요소에 끼워넣을 때에는 문자열로 작성해야 한다. ( ex. onclick="alert('thanks!')" )
- 유니코드 밖의 문자는
써로게이트 페어
를 통해 표현된다.
- 특수한 값
- undefined : undefined는 할당하지 않은 결과로, 코드로 undefined를 대입하 ㄴ것이 아니라 자바스크립트 엔진이 undefined로 초기화한 결과이다.
- 값이 아직 할당되지 않은 변수
- 없는 객체의 프로퍼티를 읽을 경우의 값
- 없는 배열의 요소를 읽으려고 시도했을 때의 값
- 아무것도 반환하지 않는 함수가 반환하는 값
- 함수를 호출했을 때 전달받지 못한 인수의 값
- undefined : undefined는 할당하지 않은 결과로, 코드로 undefined를 대입하 ㄴ것이 아니라 자바스크립트 엔진이 undefined로 초기화한 결과이다.
- 객체 타입 : 그 외의 타입들
- 객체 타입은 기본적으로
참조
를 통해서 이루어진다. 따라서 변수에 객체 타입을 대입하면, 그 변수는 해당 객체를 가리키는 상태가 된다.
- 객체 타입은 기본적으로
ECMAScript6부터 추가된 데이터 타입
심벌 (Symbol)
: 자기 자신을 제외한 그 어떤 값과도 다른 유일무이한 값, 상수를 지정할 때 사용하면 좋을 것.- Symbol("a")를 각기 다른 변수에 대입한 후 비교 연산을 하면 false로 나온다.
- Symbol.for("a")와 같이 for 메서드를 사용하면 각기 다른 변수들의 비교 연산이 true로 나온다 → 문자열로 연결된 심벌이 생성된다.
- Symbol.keyFor() 메서드를 사용하여 파라미터로 심벌이 저장된 변수를 주면 그 변수의 key가 되는 문자열을 알 수 있다.
- 템플릿 리터럴
- 이스케이프 문자가 없어도 줄바꿈을 할 수 있다.
String.raw를 사용하면 시퀀스 문자를 그대로 출력할 수 있다.
( ex. String.rawMan errs as long as\nhe strives.
; )플레이스 홀더 (보간 표현식) 을 사용할 수 있다.
객체의 기초1 (객체 리터럴)
객체를 생성하고 나서 이후에 프로퍼티나 key 값을 줄 수도 있다. 만약 없는 프로퍼티를 참조할 경우 undefined가 나온다. 빈 객체를 생성할 수도 있다. 이 내용은 이미 다 아는 내용이므로 간단하게 정리했다.
delete 연산자로 프로퍼티를 삭제할 수도 있다.
- in 연산자로 프로퍼티가 있는지 확인할 수 있다.
객체는 참조 타입이다
함수의 기초
- 함수도 호이스팅이 가능하다.
- 자바스크립트에서는 함수가 객체이기 때문에 함수를 선언하면 내부적으로는 그 함수의 이름을 변수로 한 함수 객체가 만들어지고, 함수 이름 변수에는 그 객체가 참조된다.
- 따라서 변수에 다른 함수를 참조시키는 것도 가능하다. ( ex. const sq = square; console.log(sq(5)); )
앞서 말한 것처럼 객체는 참조 타입이기 때문에, 함수의 파라미터로 객체를 주게 되면 함수 안에서 객체의 값을 바꾸는 것이 가능해진다
( C언어에서의 pointer와 동일하다. )
인수 여러 개를 우아하게 전달하는 방법
- 인수가 많아지면 착각하기 쉬워지고 프로그램을 변경 시 인수 개수가 바뀌게 되면 프로그램 전체를 바꿔야 하는 문제점이 있다.
- 이럴 경우 객체의 파라미터에 모두 담아서 객체 하남ㄴ을 전달하는 것이 좋다.
- 받을 때에는 구조분해할당으로 받으면 된다.
- 객체의 값이 바뀌는 것에 주의해야 한다.
변수의 유효 범위
- 대부분의 프로그래밍 언어는 프로그램의 구문으로 변수의 유효 범위를 결정하는
어휘적 범위
를 채택한다, 자바스크립트도 마찬가지. - 자바스크립트의 변수는 전역 변수와 지역 변수가 있다.
함수 안에서 선언자 없이 변수를 선언하면 전역 변수로 취급된다.
- let, const
- const로 선언한 것이라고 해도 객체 타입이거나 배열인 경우에는 프로퍼티 또는 프로퍼티 값을 수정할 수 있다.
함수 리터럴로 함수 정의하기
- 함수 리터럴로 함수를 정의하면 호이스팅이 발생하지 않는다. 생각해보면 당연한 게
const a = function (x) { return x; };
형태라면 a에 대입하는 것인데, 선언이 아닌 정의는 원래부터 호이스팅이 될 리 없다. - 함수 리터럴은 기본적으로 익명함수이지만, 익명함수에도 이름을 붙일 수는 있다. 이는 바깥 스코프에서는 사용할 수 없어 선언할 때만 존재하지만, 디버거를 할 때는 확인이 가능하므로 유용하다.
객체의 메서드
객체 내에서도 함수를 만들 수 있다. 이 때 함수 리터럴을 사용한다. 객체의 메서드는 this를 통해 객체의 프로퍼티에 접근할 수 있다. 또한 프로퍼티이기 때문에 나중에 추가하거나 수정할 수도 있다.
객체의 기초2 (생성자)
생성자로 객체 생성하기
이제는 class (내부적으로는 동일하지만, 어쨌거나 새로운 예약어) 가 생겨서 클래스처럼 사용할 수 있게 되었지만, 이전에는 이런 게 없었다. 그래서 객체를 생성하기 위해 new 라는 예약어를 사용했다.
function Card (suit, rank) {
this.suit = suit;
this.rank = rank;
}
const card1 = new Card("하트", "A");
다른 언어에서는 클래스를 통해 만든 객체를 인스턴스, 즉 실체라고 부르지만, 자바스크립트에서는 생성자 함수도 엄연한 함수 객체로서 실체다. 따라서 표현 상 인스턴스라고 말은 해도 인스턴스만이 실체가 아니다.
객체의 기초3 (내장 객체)
- 자바스크립트에는
처음부터 사용할 수 있는 내장 객체 (built-in object)가 마련되어 있다.
- 내장 객체는 자바스크립트라는 프로그래밍 언어의 뼈대를 구성한다.
- 내장 객체는
Object, String, Number, Boolean, Array, Date...
등, 미리 만들어놓은 생성자들을 의미한다.- Date
- Function ( function이 아니라 Function이다. )
함수의 매개 변수가 될 n개의 인자와, 함수의 몸통을 인자로 받아서 생성하는 내장 객체이다.
- 동적으로 함수를 생성하는 경우에 쓰지만, 악성 유저가 악성 코드를 전달하여 문제를 일으킬 수 있어서 잘 사용하진 않는다. 함수를 생성하는 기능보다는 래퍼 객체를 제공하는 점에서 의의를 둔다.
- 기타 내장 객체
- JSON
- Math
- Reflect : 프로그램의 흐름을 가로채는 기능을 제공
- 전역 객체 : 전역 프로퍼티 (undefined, NaN, Infinity), 생성자 (Object(), String(), Nuber() ), 그 외 전역함수와 내장 객체 등 전역에서 사용 가능한 모든 객체를 지칭
자바스크립트 객체의 분류
네이티브 객체
: ECMAScript 사양에서 정의된 객체, 앞서 말한 모든 내장 생성자 및 객체들을 의미호스트 객체
: ECMAScript에서 정의한 것은 아니지만, 실행 환경에 의해서 정의된 객체. 예컨대 브라우저에서만 사용가능한 객체들.사용자 정의 객체
: 사용자가 정의한 객체.
배열의 기초
const a = [2, , 4]
와 같이 값을 주지 않으면 undefined가 들어가게 된다. 좌측의 선언 및 정의는 length가 3인 배열이 되는 셈.- 자바스크립트 배열에는 모든 타입의 값이 올 수 있다.
- 배열의 length를 더 작은 값으로 치환하면 배열의 뒤 요소들을 삭제하게 된다.
- new Array로 배열을 생성할 수 있다. 리터럴과 다른 점은, new Array에 양의 정수를 단 1개만 넣을 경우, length가 해당 값인 빈 배열을 만들라는 의미가 된다는 점.
- 배열도 사실 객체다. a[1] 대신에 a["1"]을 써도 먹힌다.
- delete 연산자로 배열의 프로퍼티를 삭제하면 그 값이 undefined가 된다.
- 자바스크립트는 배열도 객체기 때문에 실제 프로퍼티의 수가 length보다 작은
희소 배열
이라는 개념이 있다.
연산자
- 표현식 : 결과적으로 어떤 값으로 평과되는 것
- 산술 연산자
- 자바스크립트에서는 정수끼리 나누어도 부동소수점으로 된다.
- 나머지연산자의 결과값도 부동소수점이다.
-
- 연산자는 피연산자 중 하나가 문자열이면 나머지 하나도 문자열로 만든다.
- 계산할 수 없는 경우에는 NaN으로 평가된다. true면 1, false나 null이면 0으로 표현한다. undefined는 NaN으로 평가된다.
Math 객체의 프로퍼티에는 사술연산자와 복잡한 수학적 연산을 지원하는 다양함 메서드들이 있다
부동 소수점 오차
- 일반적으로 값이 비슷한 두 숫자의 뺄셈에서 발생하며, 10으로 딱 떨어지는 값끼리에서도 발생한다. (어차피 컴퓨터는 2진수로 계산하기에 10진수로 나뉘어 떨어지는 건 의미가 없다.)
문자열 제어하기
-
- 연산자는 피연산자 중 하나가 문자열 또는 문자열로 변환될 수 있는 객체이면 다른 피연산자의 타입도 문자열로 변환하고, 문자열끼리의 + 연산 결과는 문자열 연결이다.
- 1 + { } 의 결과는 "1[object Object]"가 된다.
- 연산자는 피연산자 중 하나가 문자열 또는 문자열로 변환될 수 있는 객체이면 다른 피연산자의 타입도 문자열로 변환하고, 문자열끼리의 + 연산 결과는 문자열 연결이다.
- String() 생성자를 통해서 문자열을 만들 수 있다.
- String()이 어떤 역할인지?
- 일반적인 문자열과 new String()을 통한 객체 생성의 차이
- 문자열 메서드
- str.substring(a,b) : a번째 문자부터 b번째 문자 이전까지의 문자열을 가리킨다. (a,b가 모두 양수라 가정)
- str.slice(a, b) : 위와 같다. (a,b가 모두 양수라 가정)
- str.slice(음수값) : 마지막에서 음수값 만큼을 반환.
- str.slice(음수값, 음수값) : 마지막 문자열부터 세서 앞 파라미터 문자부터 뒤 파라미터 문자 이전의 문자열
- str.indexOf("t")
- str.indexOf("i", 10)
- str.split(" ")
- str.replace("p", "P")
- str.toUpperCase()
- str.toLowerCase()
- str.endsWith(".")
- str.includes("thing")
- str.charCodeAt()
- str.codePointAt() → 써로게이트 페어를 지원한다.
- String 생성자가 가지고 있는 프로퍼티
- String.length
- String.fromCharCode()
- String.fromCharPoint()
- String.prototype
- String.raw
- 모든 문자열, 그리고 문자는 불변하다.
논리 연산자와 관계 연산자
- 같은 인덱스를 가지고 있는 배열이라고 해서 비교 연산 결과가 true인 것은 아니다. 서로 같은 배열을 참조하고 있는 경우에만 true를 반환한다.
단락평가
- 논리곱 연산자와 논리합 연산자는 true, false 와 같은 논리 값 대신에 마지막으로 평가한 피연산자의 값을 반환한다.
- 0을 제외한 모든 숫자는 논리연산 결과 true로 된다. ( Boolean ( -100 ) === true // true )
- && (논리곱) 연산자는 오류를 제거하는 데에 유리하고, || (논리합) 연산자는 null, undefined 값이 아닌 값을 선택할 때 유용하다.
논리합을 사용할 때 전자의 값이 0이나 "" 등처럼 false로 평가되는 값이면 사용이 불가능하다는 단점이 있다.
비트 연산
- 나중에 깊게 공부해보자 :)))
기타 연산
- typeof → number, string, boolean, undefined, object, symbol, function으로 표시된다. null 값은 object로 나온다.
- ?: (삼항연산자)
- void
- , (쉼표)
- delete
- new
- in
- instanceof
- eval() : 원래는 함수이고 연산자가 아니지만, 연산자의 역할을 담당하고 있었다. string을 받아서 JavaScript 코드로 해석하는 함수이다.
명시적 타입 변환
- Number 객체의 메서드를 사용하여 숫자에서 문자열로 바꾸기
- toString()
- toLocaleString()
- toFixed()
- toExponential()
- toPrecision()
- String 함수를 활용 ( 객체를 생성하는 게 아니라 문자열을 반환하는 함수이다. ) 하여 문자열로 바꾸기
- 수식을 활용한 묵시적 변환 ( s - 0 또는 +s) 으로 문자열에서 숫자로 변환하기
- parseInt, parseFloat 함수
- Number 함수
- !! 연산을 통해 boolean형으로 바꾸기
웹 브라우저에서의 입출력
window 객체의 window는 생략하고 사용할 수 있다. ( ex. window.alert, window.prompt, window.confirm )
Console
- console.dir : 객체의 대화형 목록을 출력
- console.error : 오류 메시지를 출력
- console.info : 메시지 타입 로그를 출력
- console.log : 일반 로그를 출력
- console.time : 처리 시간 측정용 타이머를 시작
- console.timeEnd : 처리 시간 측정용 타이머를 정지하고 타이머 시작으로부터 걸린 시간을 밀리초로 출력
- console.trace : 스택 트레이스를 출력
- console.warn : 경고 메시지를 출력
이벤트 처리기 등록하기와 타이머 알아보기
<html>
<head>
<script>
const displayTime = () => {
const now = new Date();
console.log("현재 시각은 " + now.toLocaleString());
};
</script>
</head>
<body>
<button onclick="displayTime()">현재 시각 출력 버튼</button>
</body>
</html>
이벤트의 종류
- onclick : 클릭
- ondbclick : 더블 클릭
- onmousedown : 마우스 버튼을 눌렀을 때
- onmouseup : 마우스 버튼에서 손가락을 떼었을 때
- onmousemove : 마우스 포인터가 HTML 요소 위에서 움직일 때
- onmouseout : 마우스 포인터가 HTML 요소를 벗어났을 때
- onmouseover : 마우스 포인터가 HTML 요소 위에 놓여 있을 때
- onkeydown : 키보드의 키를 눌렀을 때
- onkeyup : 키보드의 키에서 손가락을 떼었을 때
- onchange : input 요소의 값이 바뀌었을 때
- onblur : input 요소가 포커스를 잃었을 때
- onfocus : input 요소에 포커스를 맞췄을 때
- onselect : 텍스트 필드 등의 텍스트를 선택했을 때
- onsubmit : 폼 제출 버튼을 눌렀을 때
- onload : HTML을 모두 읽었을 때
- onunloadWeb : 웹 페이지가 메모리에서 내려갈 때 ( ex. 다른 페이지로 이동할 때 )
- onabort : 페이지나 이미지 읽어 들이기가 중단되었을 때
- onerror : 페이지나 이미지를 읽어 들이는 동안 오류가 발생했을 때
- onresize : HTML 요소의 크기가 바뀌었을 때
처음 보는 것들
- document.write() : HTML 태그를 String 형태로 넣어줄 수 있다. element 형태로, body에 반영된다.
- Math.sqrt() : 루트 값을 구하는 Math 함수
- dir *.js : cmd 창에서 dir 이후에 파일 명을 입력하면 그 파일만을 찾아낼 수 있다. 예제로는 와일드 카드를 사용하여 전체 탐색하였다.
- prompt() : 브라우저 상에서 alert와 같은 창을 띄워 입력을 받는다.
- 써로게이트 페어
- 심벌 (Symbol)
- String.raw
- 객체 리터럴에서 값이 저장될 위치를 확보하는 것을 플레이스 홀더라고 한다.
- delete 연산자로 객체의 프로퍼티 쌍을 삭제해버릴 수 있다.
- 객체는 참조타입이라서 함수의 파라미터로 전달하여 값을 변경한 경우 함수의 바깥의 객체도 함께 변경된다.
- 함수 리터럴로 정의된 함수는 호이스팅이 발생하지 않는다.
- Reflect : 프로그램의 흐름을 가로채는 기능을 제공하는 내장 객체
- 자바스크립트 객체의 분류
- 배열의 length를 조절해서 다른 요소들을 삭제할 수 있다.
- 희소 배열
- 래퍼 객체 (142p)
나중에 깊게 공부해볼 것
- 기본적으로 위에 있는 것들은 다시 보도록 한다.
- Date 객체
- Math의 프로퍼티, 메서드들
- 부동소수점 오차 문제
- 문자열의 함수들
- 비트연산
- Console 객체
해결 못한 의문
- window.String.length는 왜 항상 1이 나오는가? 그리고 이것의 의미는 무엇인가?
- console.tme과 console.timeEnd 메서드를 통한 시간은 왜 항상 다르게 나오는가?
반응형
'프로그래밍 > JavaScript' 카테고리의 다른 글
Express 프레임워크 만들기(1) (0) | 2021.05.20 |
---|---|
Nestjs 시작하는 법 (0) | 2021.03.16 |
[javaScript] 객체와 생성자, Symbol() (0) | 2020.08.02 |
[javaScript] 가비지 컬렉션 (0) | 2020.08.02 |
[javaScript] 형변환과 테스트하기 좋은 코드 (0) | 2020.08.01 |