2023/07/27
JavaScript는 Browser
와 node.js
환경에서 읽힐 수 있고, 읽히는 순간 실행 컨텍스트
가 생성된다.
실행 컨텍스트
는 Global(전역)
과 Function
으로 나뉜다.
Lexical Environment(어휘적 환경)
가 생성되고,
Lexical Environment
에는 Environment Record(기록하는 환경)
가 생긴다.
Environment Record(기록하는 환경)
에서는 Object Environment(객체 환경)
, Declarative Environment(선언 환경)
, this
로 나뉜다.
Object Environment
=>Binding Object
(var, function)
=> window의 객체에 묶인다.Declarative
=>let
,const
=> Temperal Dead Zonethis
=>GlobalThisValtue
전역 객체를 사용하면 어디서나 사용 가능한 변수나 함수를 만들 수 있다.
=> 전역 변수는 성능적인 측면에서 되도록 사용하지 않는 것이 좋다.
- 브라우저 환경의 전역 객체는
window
, Node.js 환경의 전역 객체는global
이다.
=> explorer를 제외한 모든 환경에서 사용되도록 통합된 전역 객체는globalThis
이다.var
로 선언된 변수는 전역 객체의 프로퍼티가 된다.
전역을 오염시키지 않기 위해 변수를 객체에 할당하면 객체 안에서만 사용할 수 있는 변수가 된다.
객체이름.변수이름 = 값
함수를 정의하게 되면 global
안에 global
과 동일한 방식으로 동작하는 함수의 환경이 생성된다.
- 같은 블록 내에서 변수에서 찾는다.
- 같은 블록 내의 매개변수에서 찾는다.
- 상위 요소에서 변수에서 찾는다.
- 상위 요소의 매개변수에서 찾는다.
- 상위로 가면서 반복한다.
세미콜론은 선택적인데, []
앞에는 세모콜론이 있다고 가정하지 않는다.
데이터를 기억하기 위해 변수에 담으며, 변수는 유지보수와 성능 측면에서 사용이 필수적이다.
문자
, 숫자
, _
, $
만 올 수 있고, 숫자가 처음에 올 수 없다.let 변수이름
(영어의 대소문자는 구별된다.)var
, let
, const
를 사용하여 변수를 선언한다.
- 변수의 이름은 간결하고 무엇을 담는지 명확하도록 설정하며, 줄임말은 피한다.
- 변수의 이름에는
snake case
를 사용하거나,camel case
를 사용한다.- 여부를 물어볼때는
is
,has
로 시작하는 이름을 주로 사용한다.
선언한 변수에 값을 담는 행위를 말한다.
변수이름 = 값
let(var) 변수이름 = 값
var
는 함수 내에서 사용된 것이 아니라면, 전역에서 접근이 가능한 변수이다.
=> 전역에서 접근이 가능한 이유는,var
를 사용한 선언은 문서의 최상단으로 호이스팅되기 때문이다.할당은 호이스팅되지 않기 때문에 undefined로 출력된다.
=> 블록 스코프가 없다.
=> 함수의 스코프에는 영향을 받는다.
상수는 재할당하지 않을 것이라고 확신이 들 때 사용한다.
상수의 이름 규칙은 변수의 이름 규칙과 같고, 상수는 선언과 동시에 할당이 되어야 한다.
const 상수이름 = 값
코드가 실행되기 전 이미 값을 알고 있는 상수는 대문자로 이름을 선언한다.
기본적으로 자바스크립트는 모든 버전이 호환되도록 설계되어 있는데,
모던 자바스크립트만을 사용하기 위해, 문서에 'use strict'
지시자를 사용한다.
엄격모드를 사용한 후에는 사용 전으로 되돌릴 수 없다.
Infinity
,-Infinity
,NaN
도 숫자형에 포함된다.
모든 수를
0
으로 나누면Infinity
가 된다.
2**53-1
보다 크거나 -2**53-1
보다 작은 정수는 숫자형으로 나타낼 수 없다.
숫자형 뒤에
n
을 붙이면 BigInt로 표현된다.
따옴표로 감싸주면 문자형으로 되며, 따옴표의 종류는 "" | '' | ``
세가지이다.
문자열에 변수나 표현식을 넣을 때는
``
를 사용하고, 변수나 표현식을${}
로 감싸서 넣어준다.
true
또는 false
로 반환된다.
값을 알 수 없거나, 비어있을 때 null
로 반환된다.
값이 할당되지 않았을 때 undefined
로 반환된다.
변수의 값이 비어있거나 알 수 없는 상태를 나타낼 때는
undefined
가 아닌null
을 주로 사용한다.
고유한 식별자를 만들 때 사용한다.
데이터 컬렉션이나 복잡한 개체를 표현할 때 사용한다.
=> function
과 array
도 object
유형에 속한다.
=> 객체를 생성할 때는 new Function(Array, Object)()
함수를 사용할 수 있다.
자료형의 종류를 반환한다.
typeof 값
연산자 또는typeof(값)
함수로 사용된다.typeof null
의 값이object
로 반환되는 것은 오류이다.typeof function
의 값이function
으로 반환되는 것은 오류이다.
Object.prototype.toString.call()
=>typeof
보다 더 정확하게 어떤 자료형인지 확인할 수 있다.
=>[object 자료형]
와 같이 반환된다.
숫자 + 문자 = 문자
- 숫자형 문자 값을 숫자 값으로 바꾸기
=> 숫자형 문자 값에+
를 붙이거나,-0
또는*1
또는/1
숫자 + null = 숫자
숫자 + undefined = NaN
typeof value; // boolean
String(value);
typeof value; // string
typeof value; // boolean
value = value + '';
typeof value; // string
const value = '123';
typeof value; // string
Number(value);
typeof value; // number
undefined
와 문자열이 들어 있는 값을 숫자형으로 변환하려고 하면,NaN
이 반환된다.null
을 숫자형으로 변환하면,0
이 반환된다.- 숫자 값의 양쪽 공백이 제거된다.
const value = '123';
typeof value; // string
value = +value( value * 1 | value / 1 );
typeof value; // number
const value = 0;
typeof value; // number
Boolean(value); // false
typeof value; // boolean
const value = 0;
typeof value; // number
value = !!value; // false
typeof value; // boolean
!
를 하나만 붙이면 불린 값이 반대로 바뀐다.(부정된다.)
피연산자가 한 개일 때를 말한다.
=> -
로 부호를 바꾸는 경우
피연산자가 두 개일 때를 말한다.
=> 숫자1 + 숫자2
사칙연산과 같이 일반적이 연산이 해당된다.
숫자 값과 문자형 숫자 값을 더하면 문자열로 변환된다.
2 + 2 + '1' = '41'
배열을 합치기 위해서는
배열1.concat(배열2)
메소드를 사용할 수 있지만 주로 사용하는 방법은 아니다.
주로 배열을 합칠 때는[...배열1, ...배열2]
로 합친다.
문자형 숫자 값도 연산을 하게 되면 숫자형으로 변환되어 계산된다.
'5' - '3' = 2
'5' * '3' = 15
여러 연산들을 쉼표로 구분하게 되면, 모두 실행은 되지만 마지막 식만 반환이 된다.
비교 연산자는 불린 값을 반환한다.
문자형 숫자 값과 숫자 값을 비교할 때는 숫자 값으로 변환되어서 비교된다.
예외적인 경우
null == undefined
는true
이다.null
null > 0 // false null == 0 // false null >= 0 // true
일치 연산자 ===
는 자료형의 동등 여부까지 검사한다.
AND(&&
), OR(||
), NOT(!
)
=> &&
가 ||
보다 먼저 평가된다.
||
true
여도 true
로 반환되기 때문에, 처음으로 true
를 만났을 때 실행을 중단하고 해당 값을 반환한다.true
도 찾지 못했을 때는, 마지막까지 실행됐기 때문에 마지막 false
의 값을 반환한다.&&
true
여야 true
로 반환되고, 마지막까지 실행됐기 때문에 마지막 true
의 값을 반환한다.false
여도 false
로 반환되기 때문에, 처음으로 false
를 만났을 때 실행을 중단하고 해당 값을 반환한다.조건이 많을 때 if 문
보다 유용하다.
switch (인수) {
case 조건: 조건이 참일 경우 실행될 문장;
break;
default: 참인 조건이 없을 때 실행될 문장
break
가 없으면true
인case
이후의 모든case
및default
를 실행한다.case
를 이어서 쓰면||
으로 묶인다.
조건 ? 값1 : 값2
=> 조건
이 참이면 값1
을 그렇지 않으면 값2
를 반환한다.
||
와 유사하지만, ||
와 다르게 정의된 값을 만나면 해당 값을 반환한다.
a = 0;
b = 1;
a || b // 0은 false이기 때문에 1을 반환한다.
a ?? b // 0은 정의된 값이기 때문에 0을 반환한다.
- a가
null
이나undefined
가 아니라면(정의된 값을 가졌다면) a를 반환한다.
=> a가 정의되지 않았다면(null || undefined
) b를 반환한다.
=> 안정성 측면에서&&
,||
와 함께 사용하지 못한다.
continue
지시자 아래의 구문을 실행하지 않고, 다시 조건으로 돌아간다.
조건이 true인 동안 계속 실행된다.
while(조건) {
실행될 구문
}
while과 동일하지만 무조건 do의 코드를 최소 한번 실행한다.
=> 무조건 한번은 실행되어야 할 때 사용한다.
do {
실행될 구문
} while(조건)
for (시작값; 조건; 갱신) {
실행될 구문
}
for(let 변수이름 in 객체이름) {}
=> 객체에서 순환하며 key를 찾을 때 사용한다.
for (let 변수이름 of 배열이름) {}
[[prototype]]
에symbol.iterator
를 가지고 있어야 사용이 가능하다.
throw new Error('에러메세지')
에러 메세지를 출력한다.
콜백함수
=> 나중에 호출되는 함수
arguments
객체를 사용해서 함수의 매개변수 없이 함수를 사용할 수 있다.
=>arguments
는 유사배열이며for-of문
으로 순환이 가능하다.
function 함수이름() {}
- 함수를 선언하면 최상단으로 호이스팅되기 때문에 어디서든 사용이 가능하다.
- 엄격모드에서는 블록의 영향을 받기 때문에, 블록 내에서만 사용이 가능하다.
show~
=> 무언가를 보여줄 때get~
=> 값을 반환함calc~
=> 무언가를 계산할 때create~
=> 무언가를 생성할 때check~
=> 무언가를 확인하고 불린값을 반환할 때함수를 변수에 할당한다.
let(const, var) 함수이름 = function() {}
- 변수 선언만 최상단으로 호이스팅되기 때문에 코드를 만나기 이전에는 사용할 수 없다.
- 블록의 영향은 받지 않기 때문에 코드 이후에는 어디서든 사용이 가능하다.
let func = (arg1, arg2, ...argN) => expression
()
안에 매개변수를 담고,=>
뒤에 return할 값을 담는다.
=> return 값이 여러 줄이라면,{}
안에return
지시자 뒤에 값을 담는다.- 매개변수에
...argN
=> 나머지 인수를 배열로 만들어준다.
일반 함수
와화살표 함수
에서의this
의 차이점
- 일반함수의
this
=> 나를 호출한 대상을 가리킨다.- 화살표함수의
this
=>this
를 바인딩할 수 없으며 부모의this
를 가리킨다.
함수이름()
함수가참조된변수이름()
매개변수 = 기본값
으로 기본값을 정의할 수 있다.function 함수이름(매개변수 = 기본값) {}
함수를 사용할 때, 변수에 넣을 인수(arguments)
함수이름(인수)
함수에서 처리되야 할 코드를 return
을 작성하여 결과를 반환해야 결과값이 저장된다.
- 결과 값이 요구될 때는
get~함수
- 결과 값이 요구되지 않을 때는
set~함수
- window.parseInt()
=> 인수에서 정수만 10진수로 추출한다.
=> 문자 뒤에 있는 정수는 추출되지 않는다.- window.parseFloat()
=> 인수에서 실수만 10진수로 추출한다.
=> 문자 뒤에 있는 실수는 추출되지 않는다.- window.alert()
=> 사용자에게 인수를 보여준다.- window.confirm()
=> 사용자에게 인수를 보여주고, 확인 또는 취소의 답변을 받는다.- window.prompt()
=> 사용자에게 인수를 보여주고, 답변을 입력할 수 있도록 한다.
=> 입력된 답변은 데이터로 저장되며, 숫자를 입력하더라도 문자형으로 저장된다.- window.console.log()
=> 콘솔 창에 인수를 보여준다.- window.console.info()
=> 콘솔 창에 인수를 정보로 보여준다.- window.console.warn()
=> 콘솔 창에 인수를 경고로 보여준다.- window.console.error()
=> 콘솔 창에 인수를 에러로 보여준다.window는 전역객체로서, window를 생략하고 메소드만 사용할 수 있다.
parseInt()와 Math.floor()의 차이점
- parseInt()는 소수를 아예 삭제하고 정수만 반환하고,
- Math.floor()는 소수를 반내림하기 때문에, 음수인 경우에 차이가 발생한다.
parseInt(-5.5) // -5 Math.floor(-5.5) // -6
전역을 오염시키지 않기 위해 사용한다.
=> IIFE
를 변수에 할당하면 함수의 return
값만 저장된다.
(function () {
})(); // 뒤에 바로 ()를 붙여준다.
- 익명 함수를 사용한다.
- 함수 정의 후
()
로 감싸준 다음 뒤에()
를 붙여 즉시 실행되도록 한다.
- 객체의 메소드를 정의할 때는 화살표 함수 사용을 지양한다.
=> 객체 안에서의this
를 찾을 수 없기 때문이다.- 메소드 안에서의 함수를 호출할 때는 화살표 함수 사용을 지향한다.
=> 메소드 안에서 일반함수를 사용하고this
를 찾게 되면 예상한 값과 다르게 나올 수 있기 때문이다.
상위 환경에서 this
를 찾았을 때의 값을 가져온다.
key
를 변수로부터 받아와서 처리할 때는.
표기법이 아닌[]
표기법으로 불러온다.
=> 계산된 프로퍼티 (computed property
)
key
와 value
가 같을 때에는 하나만 써서 표현할 수 있다.
object = {
name, // name: name
email // email: email
}
Object.prototype.hasOwnProperty.call(객체이름, 'key')
=>Object.prototype
은({})
로 대체할 수 있다.
.call()
메소드를 사용하면 다른 자료형의 기능을 수행할 수 있다.
=>기능을가지는자료형.prototype.기능이름.call()
=> 객체가 가지는 고유의 기능(Instance Method
)이 있고,
공통적으로 사용할 수 있는 기능(Static Method
)이 있다.
Object.keys(객체이름)
=> 모든 key를 배열로 반환한다.Object.values(객체이름)
=> 모든 value를 배열로 반환한다.Object.entries(객체이름)
=> key와 value를 각각 쌍으로 하는 배열로 반환한다.객체를
for-of
로 순환하려면 배열로 바꾸고 사용한다.
object.key = null; // object의 key를 null로 한다.(제거)
delete object.key; // object의 key를 delete한다.(삭제)
객체를 분해해서 변수에 담을 때 사용하며,
순서를 바꿀 수 있고 변수의 이름을 바꾸려면 변수 객체의 value를 설정해주어야 한다.
const salaries = {
권: 50,
이: 3000,
강: 500,
김: 700
} // 변수 선언 및 객체를 변수에 할당
const {권, 이, 강, 김} = salaries // salaries의 '권, 이, 강, 김'이라는 key의 value를 '권, 이, 강, 김'이라는 변수에 각각 할당한다.
/*
const 권 = salaries.권
const 이 = salaries.이
const 강 = salaries.강
const 김 = salaries.김
*/
{...객체이름, ...객체이름}
New Date()
로 새로운 Date 객체를 만들 수 있다.
=> ()
안에 연, 월, 일, 시, 분, 초 순서대로 삽입할 수도 있다.
- 연도 구하기
=>.getFullYear()
메소드를 사용한다.- 월 구하기
=>.getMonth()
메소드를 사용한다.
=> 1월이 0으로 반환되기 때문에+1
을 해줘야 한다.- 일 구하기
=>.getDate()
메소드를 사용한다.- 요일 구하기
=>.getDay()
메소드를 사용한다.
=>0 ~ 6
으로 반환되며,0
은 일요일이다.- 시간 구하기
=>.getHours()
메소드를 사용한다.- 분 구하기
=>.getMinutes()
메소드를 사용한다.- 초 구하기
=>.getSeconds()
메소드를 사용한다.- 밀리초 구하기
=>.getMilliseconds()
메소드를 사용한다.- 현재 시간을 밀리초 값으로 구하기
=>.getTime()
메소드를 사용한다.
=> 1970년 1월 1일 00시 00분 00초 이후의 밀리초를 반환한다.
[...]
(spread syntax)Array.from(객체이름)
배열을 분해해서 변수에 담을 때 사용하며,
순서를 바꿀수 없고 변수의 이름은 바꿀 수 있다.
let color = ['#ff0000', '#2b00ff', '#00ff2f'] // 변수 선언 및 배열을 변수에 할당
let [red, blue, green] = color // 배열의 요소들을 순서대로 변수에 각각 할당한다.
/*
let red = color[0]
let blue = color[1]
let green = color[2]
*/
값 복사
원시데이터(null
,undefined
,string
,number
,boolean
)의 값을 복사 할 수 있다.
=> 복사된 값이 변경되었을 때 변수의 값은 변경되지 않는다.
값 참조
객체 유형(object
,array
,function
)의 값을 참조할 수 있다.
=> 참조된 값이 변경되었을 때 변수의 값도 같이 변경된다.
=>for 문
을 사용해서 객체 유형도 복사할 수도 있다.값 참조에서 복사하는 방법
Object.assign(복사받을객체이름, 복사할객체이름1, ...)
spread syntax(...)
복사받을객체이름 = {...복사할객체이름}
extends
한 경우에,constructor
를 수정한다면super()
를 필수로 사용해야 한다.
=> 부모의property
를 이어받아 사용한다.static
지시자를 사용하면class
에 메소드가 정의된다.#
을 사용하면 외부에서property
에 접근하지 못하게 할 수 있다.
전역을 오염시키지 않기 위해 사용한다.
=> 지역변수를 기억하고 외부에서 수정할 수 없도록 한다.
에러가 나는 경우에 에러가 나지 않도록 해준다.
?.
은 undefined
나 null
이면 평가를 멈추고 undefined
를 반환한다.
Math.floor(number)
=> 소수를 내림한다.Math.round(number)
=> 소수를 반올림한다.Math.ceil(number)
=> 소수를 올림한다.Math.trunc(number)
=> 소수 이하를 절삭한다.Math.random()
=> 0 이상 1 미만의 랜덤한 수를 반환한다.Math.max(numbers)
=> 수 중 최댓값을 반환한다.Math.min(numbers)
=> 수 중 최솟값을 반환한다.Math.pow(number, 거듭제곱)
=> 수를 거듭제곱한 값을 반환한다.Math.abs(number)
=> 절대값을 반환한다.
.length
=> 공백을 포함한 길이를 반환한다..slice(number1, number2)
=>number1
번째부터number2
번째 전까지를 자른 복사본을 반환한다.
=> 오른쪽부터 순서를 세려면number
에 음수를 넣는다.
=> 인수를 넣지 않으면 그대로 배열로 반환한다..subString(index1, index2)
=>index1
부터index2
까지를 반환한다..substr(index, number)
=>index
부터number
개 글자를 반환한다..indexOf('string')
=> 문자열이 포함됐는지를 확인한다.
=> 포함됐으면index
를, 포함되지 않았으면-1
을 반환한다..lastIndexOf('string')
=>.indexOf()
와 동일한 방식이나, 뒤에서부터 값을 찾는다..includes('string')
=>string
을 포함하는지boolean
값으로 반환한다..startsWith('string')
=>string
으로 시작하는지boolean
값으로 반환한다..endsWith('string')
=>string
으로 끝나는지boolean
값으로 반환한다..trim(Start | End)()
=> 공백을 없애준다..repeat(number)
=>number
만큼 반복한다..toLowerCase()
=> 소문자로 변환한다..toUpperCase()
=> 대문자로 변환한다.
원형 파괴
push()
=> 배열의 마지막에 요소를 추가한다.
=> 반환은 length 값pop()
=> 배열의 마지막 요소를 추출한다.unshift()
=> 배열의 앞에 요소를 추가한다.
=> 반환은 length 값shift()
=> 배열의 앞 요소를 추출한다..reverse()
=> 배열을 뒤집어준다..splice(index, 제거될개수, itemN)
=>index
부터 개수만큼 제거하고 item을 추가해준다..sort(a-b)
=>a-b
의 결과가0
보다 작으면 a가 b보다 앞에 위치한다.
=>a-b
의 결과가0
이면 a와 b의 위치를 바꾸지 않는다.
=>a-b
의 결과가0
보다 크면 a가 b보다 뒤에 위치한다..join(value)
=> 배열의 요소들을value
로 구분하여 하나의string
으로 반환한다.
새로운 배열 반환(원형 비파괴)
.concat(배열n)
=>배열1
과배열2
를 합쳐서 새로운 배열을 반환한다..slice()
.toSorted()
=>.sort()
와 동일하게 동작한다..toReversed()
=>.reverse()
와 동일하게 동작한다..toSpliced()
=>.splice()
와 동일하게 동작한다..map()
=>.forEach()
와 동일하게 동작하며, 값을 반환한다.
요소 찾기
.find()
=> 해당하는 요소 1개를 반환한다..filter()
=> 해당하는 요소들을 배열로 반환한다.
요소별 reducer 실행
.reduce((누적값, 아이템) => {return 값}, 누적값의초깃값)
=> 초깃값을 올바르게 설정해 주어야 원하는 값을 얻을 수 있다.
=> 누적값의 초깃값부터 순환하면서 아이템들을 연산하고 최종 누적값을 반환한다.
=>return
이 필수이다.
=>Array().fill().reduce()
를 이용해서 반복문처럼 사용할 수 있다.
=>Array().fill()
가 반복 횟수가 된다.
string과 array의 변환
.split()
=> 문자열에서 인수를 기준으로 구분하여 배열로 반환한다..join()
=> 배열에서 인수를 기준으로 합쳐서 문자열로 반환한다.
Stack : 배열의 마지막에 추가된 요소가 먼저 추출된다.
Queue : 배열의 먼저 추가된 요소가 먼저 추출된다.
특정 문자 조합을 찾기 위한 패턴이다.
=> 정규 표현식도 객체이다.
Error
가 발생한 지점 이후의 모든 코드가 실행되지 않는 것을 방지하기 위해 사용한다.
=> 서버와 연결할 때에는 필수이다.
try {
}
catch() {
}
finally {
}
=> error
가 발생할 경우에는 try
의 코드를 중단하고 catch
의 코드를 실행한다.
=> finally
는 error
가 발생해도 작동하는 코드이다.
Error
는name
과message
,stack
으로 구분된다.
=>stack
=name
+message
(Browser Object Model)
http://localhost:5500/index.html?type=listing&page=2#title
http://
=> protocol(프로토콜)localhost:5500
=> port(포트 넘버)/index.html
=> pathname(경로명)?type=listing&page=2
=> search(검색)#title
=> hash(해시)
platform
=> 브라우저가 실행되는 플랫폼 정보를 반환한다.userAgent
=> 브라우저와 운영체제 정보를 반환한다.language
=> 브라우저에서 사용되는 언어를 반환한다.onLine
=> 브라우저가 온라인인지의 여부를 반환한다.
height
=> 모니터 사이즈availHeight
=> 브라우저의 높이innerHeight
=> 브라우저의 내부 높이
back
=> 뒤로 가기forward
=> 앞으로 가기
(Document Object Model)
.closest(선택자)
=> 자기 자신을 포함하여 선택자와 일치하는 가장 가까운 부모 요소를 찾아준다..nextSibling
(previousSibling
)으로 다음(이전) 요소를 찾을 수 있다.nodeType
=>element
= 1,attribute
= 2,text
= 3,comment
= 8
=> 한 문서 페이지의 단위를node
라고 한다.children
=> 해당 요소의 자식 중 요소node
만을 유사 배열로 반환한다.
.matches()
=> 요소에 인수의 값이 존재하는지 확인한다..contains()
=> 요소의 자식들 중에 해당하는 요소가 있는지 확인한다.
.hidden
=>display: none
과 동일하게 작동한다.
=>HTML
에inline
방식으로CSS
를 설정하면 무시된다.
HTML
에 작성된 표준 속성
은 DOM
에서 사용할 수 있는 프로퍼티
가된다.
프로퍼티 검토
.hasAttribute()
=> 인수의 속성이 존재하는지를 확인한다..getAttribute()
=> 인수의 속성값을 가져온다..setAttribute(속성, 값)
=> 인수의 속성과 값을 설정해준다..removeAttribute()
=> 인수의 속성을 삭제한다..attributes
=> 인수가 가지는 속성들을 열거 가능한 객체로 반환한다.
비표준 속성, 프로퍼티 설정
- 비표준 속성을
data-속성
으로 수정하면 표준 속성이 된다.
=> 프로퍼티로 사용할 때는.dataset
으로 사용한다.
=>.dataset.속성
은 값을 반환한다.
=>.dataset.속성 = '값'
은 속성의 값을 수정한다.
.insertAdjacentHTML(위치, 값)
=>HTML
의 요소의 위치에 값을 추가한다.
.classList.(add | remove | toggle)(name)
=>name
의class
를add | remove | toggle
한다..classList.contains(name)
=> 요소에name
의class
가 있는지를 확인한다..style.property = value
=> 요소의property
를value
로 설정한다.getComputedStyle(요소).property
=> 요소의property
의value
를 반환한다.
Event
가 발생하면 Event Object
가 생성된다.
Event 추가
HTML
속성 활용
=>HTML
속성을 활용할 때에만 실행 연산자()
가 있어야 한다.DOM property
활용
=> Event 하나에 한 동작만 적용시킬 수 있다.Method
활용
=>.addEventListener(이벤트, 함수)
Event 제거
.removeEvenetListener(이벤트, 함수)
=> 추가된 Event의 함수와 동일한 이름을 넣어주어야 한다.
겹치는 영역에서 상위 요소의 Event
가 같이 동작하는 현상을 말한다.
=> Event Object
에 .stopPropagation()
을 사용해서 방지할 수 있다.
Bubbling
의 Event
의 동작 순서가 반대로 된다.
=> Event
의 함수 뒤에 true
를 줘서 사용한다.
Bubbling
이 발생하는 상황에서, 상위 요소의 Event
가 하위 요소로 위임되는 것을 말한다.
.currentTarget
=>Event
를 갖고 있는 요소를 반환한다..target
=>Event
를 동작시킨 요소를 반환한다.
.closest()
를 활용하여 동작 범위를 상위 요소까지로 확장시킬 수 있다.- 화살표 함수에서는
currentTarget
을 사용한다.
type="module"
로 실행한다.
- 항상 엄격 모드로 실행된다.
- 각각의
module
들이 캡슐화되기 때문에 각자의scope
를 가진다.module
끼리export
|import
해서 사용한다.
=> 주제가 비슷한module
끼리 폴더에 저장하고,index.js
로 합쳐서 호출한다.module
은 여러번 호출되더라도 한 번만 실행된다.- 항상
defer
속성이 적용된다.
Asynchronous Javascript And XML - 상황
User Interface
에서 Web Server
로 모든 데이터를 요청하고 받는다.
코드의 실행 흐름과 다르게 동작하는 코드
setTimeout(콜백함수, ms)
=>ms
뒤에콜백함수
가 실행된다.setInterval(콜백함수, ms)
=>ms
마다콜백함수
가 실행된다.
setTimeout()
과setInterval()
를 실행하면 고유의id
를 반환한다.
=>clearTimeout(id)
또는clearInterval(id)
로 함수를 종료시킨다.
User Interface
에서 필요한 데이터를, Ajax Engine
을 통해 문자화 된 JSON data
로 Web Server
에 요청하고, Ajax Engine
을 통해 문자화 된 JSON data
를 받는다.
=> sync
에 비해 부드럽게 데이터를 가져온다.
문자화 된 데이터는
JSON.parse()
또는JSON.stringify()
를 사용해 변환한다.
Repressentational State Transfer - 방법
POST
(Create)GET
(Read)PUT
(Update)DELETE
(Delete)
new XMLHttpRequest()
생성자 함수를 변수에 담는다..open()
메소드를 사용해서 웹페이지를 연다..addEventListener('readystatechange', 콜백함수)
메소드를 사용하여 변화되는 상태에 따른 코드를 작성한다..send()
메소드를 사용하여 보낸다.
JSDoc
=>/** */
주석을 이용해서 함수에 대한 설명을 만들어줄 수 있다.
순차적으로 실행되지 않는 코드에 콜백 함수를 매개변수로 하여 비동기 코드를 순차적으로 실행되도록 한다.
코드가 복잡하고, 어느 시점에서 코드가 실행됐는지 파악하기 어려운 콜백 함수 패턴을 개선하기 위해 사용한다.
let promise = new Promise(function(resolve, reject) {excutor})
excutor
는 반드시 실행된다.resolve
또는reject
중 하나는 반드시 설정해야 하고, 둘 중 하나만 실행된다.
=>resolve
가 실행됐을 때의state
는fulfilled
이다.
=>reject
가 실행됐을 때의state
는rejected
이다.이후의 처리는
.then()
메소드를 사용하여 처리할 수 있다.promise().then(() => { return b() }).then(() => {
.then()
메소드의 첫 번째 인수는promise
가 이행되었을 때 실행될 함수(result
)이다.- 두 번째 인수는
promise
가 이행되지 않았을 때 실행될 함수(error
)이다.- 보통은 두 번째 인수는 설정하지 않고,
.catch()
절에서promise
가 이행되지 않았을 때의 실행될 함수를 설정한다.
.then
| .catch
| .finally
를 호출하면 promise
가 반환되기 때문에,
반환된 값에 다시 메소드를 사용할 수 있다.
비동기 통신에서 항상
promise
를 반환하도록 해야 언제든chaining
하기에 유리하다.
function
앞에 async
를 붙이면 해당 function
은 항상 이행된 promise
로 반환된다.
async
함수 안에서나 promise
객체 앞에서, promise
가 처리될 때까지 기다렸다가 이후에 실행된다.
let value = await promise;
promise
가 처리되기를 기다리는 동안, 다른 일들을 수행할 수 있기 때문에 리소스가 낭비되지 않는다는 장점이 있다.promise
에all
을 붙여 모든promise
가 처리되길 기다리도록 할 수 있다.result
값을 반환해 주는 역할을 한다.
promise
가 이행되지 않으면, throw
문처럼 error
를 던져준다.
error
에try-catch
문을 사용할 수 있다.
페이지 새로 고침 없이 정보를 받아올 때 사용한다.
fetch()
를 호출하면 네트워크 요청을 보내고 promise
가 반환된다.
=> await
또는 .then()
을 사용하여 데이터를 받은 후의 동작을 처리한다.
let promise = fetch(url, [options])
options
=>options
에 인수를 넘기지 않으면,GET
요청으로 실행된다.
response
의 메소드를 활용하여 응답받은 본문을 처리할 수 있다.
=> 본문을 읽을 때는 하나의 메소드만 사용할 수 있다.
.json()
메소드를 이용하여 받은 값을 불러올 수 있다.
- 응답 헤더
=>response.headers
에map
과 유사한 형태로 저장된다.- 요청 헤더
=>headers
options
을 사용해 요청 헤더를 설정할 수 있다.- POST 요청
=>GET
이외의 요청에는 추가options
를 사용해야 한다.
body
는 문자열 |FormData
|Blob
|BufferSource
|URLSearchParams
중 하나여야 한다.
origin
이 같은 경우 모든 탭과 창에서 데이터가 공유된다.
.setItem(key, value)
로item
을 저장할 수 있다.
👉.getItem(key)
로 해당key
의value
를 가져올 수 있다.item
은 문자형만 저장할 수 있으나,JSON.stringify()
를 이용하면 객체를 저장할 수 있다.
👉JSON.parse()
를 이용하여 객체로get
한다.