화면을 유저에게 보여주기 위해서는 다음과 같은 전체적인 흐름을 따른다.
[데이터 가공] --데이터 처리--> [화면 표현] <--interaction--> [유저]
- 데이터 가공: 변수, 자료형, 함수(ex. flow control, 빌트인 객체) 등으로 데이터를 처리한다. 실행을 위해서는 엔진, 언어가 갖고 있는 매커니즘에 대한 이해, Error처리 등을 알아야 한다.
- 화면 표현: 브라우저에서 파일을 로드해 데이터를 비동기로 조회한다. 보여주는 과정은 Rendering이고, 인터렉션 되도록 셋팅하는 것은 Event를 사용한다.
- 유저: 여러 기능을 결합해 사용자의 문제를 해결하는 서비스를 개발한다. 이를 위해서는 코드를 잘 관리하는 방법과 서비스 개발을 위한 계획을 잘 짜는 것이 좋다.
IDE: vscode
에뮬레이터: iterm2
브라우저: 크롬
IDE : 문서를 작성하고 실행할 수 있는 도구로 소스코드 작업, 로컬에서 작동, 디버깅을 가능하게 해줌, vscode를 사용할 것이다.
terminal: macOS라면 자체 터미널 또는 iTerm2를 사용할 것
브라우저: 크롬, 사파리, 오페라, 엣지 등 각 브라우저의 JavaScript 엔진(V8, SpiderMonkey 등)이 조금씩 다르므로 크로스 브라우징 이슈에 주의
브라우저에는 개발자 도구라는 기능이 있다.
소스코드를 직접 확인하고, 자바스크립트와 css등을 편집할 수도 있다.
- elements: 소스코드를 볼 수 있다.
- console: js코드를 실행해볼 수 있다.
- sources: 브라우저에 로드된 파일을 볼 수 있다.
- network: 네트워크 로그를 확인할 수 있다.
- performance: 레코딩을 통해서 웹에서 실행되는 과정을 기록하여 성능등을 확인할 수 있다.
- application: 브라우저의 저장 기능을 확인할 수 있다.
- 등등이 있다.
개발을 하다보면 이슈(개발 중에 일어나는 일, 버그)를 많이 만나게 된다.
이러한 이슈를 찾아내서 원인을 밝히고 수정하는 작업을 디버깅이라고 한다.
디버깅 방법으로는 코드에 log함수 심기, 개발자 도구 source탭 활용하기 등이 있다.
컴파일 언어: 사람이 작성한 코드를 기계어로 변환한 후 실행
인터프리터 언어: 코드를 실행 시점에 해석하며 동시에 실행
최신 엔진(V8 등)은 JIT(Just-In-Time) 컴파일 기법을 사용하여 성능을 개선합니다.
let 변수 = 1;
typeof 변수; // "int
변수 = "abc";
typeof 변수; // "string"Funcdamental
자바스크립트의 발전
왜 표준화 작업을 했을까?
원래는 웹 페이지의 보조적인 기능을 수행하는 말 그대로 "스크립트"의 기능을 위해 생겨남
근데 이걸 실행할려먼 브라우저들이 자기들 만의 기능들을 개발함
그래서 어디서는 실행되고, 어디서는 실행안되는 크로스 브라우징 이슈가 생겨남,
즉, 개발자들 갈려나가는 호환성 문제 때문에 표준화를 진행함
그래서 넷스케이프가 이거 표준화하자 하면서 만듬, 이게 ECMAScript1, ES1으로 생겨난거임
언어 버전을 고려하면서 개발하는데, 아직 완전히 통일된게 아님
이런건 해결해줄려고 Bable과 같이 버전에 따라 코드를 수정해주는 여러 튤들이 있음
표기법이 있음
ECMAScript{{연도}}- ECMAScript2015
ES{{연도}} - ES2015
ES{{판}} - ES11
ECMAScript2015 - ES2015 - ES6모두 같은 버전이다.
지금은 ECMAScript2022까지 나옴
대부분 사용하는게 ES6임
브라우저의 버전마다, 지원하는 자바스크립트 스펙이 상이함
개발 기능의 지원, Caniuse버전을 확인하면 좋음
개발에는 사용하고 싶은데, 브라우저 지원이 안될경우?
데이터를 담아둔 메모리의 주소를 쉽게 식별하기 위하여 붙인 이름
데이터를 처리하기 위해, 기억해야한다.
메모리의 주소값의의 별칭, 변수
자바스크립트의 변수 syntax
const foo = 1;
log의 위치, 변수 키워드가 다른 것 뿐인데, 왜 결과가 다를까?
3단계를 거쳐 생성되는 변수
1. 선언 단계 변수를 변수 객체에 등록한다.
2. 초기화 단계 변수를 메모리에 할당하고, undefined로 초기화 한다.
3. 할당 단계 undefied로 초기화된 변수에 실제로 값을 할당한다.
변수 생성 3단계는
키워드별로다르게 동작한다.
var 키워드
호이스팅
단점
const, let키워드
코드 평가 시점에 선언만 진행되므로, 변수의 할당문이 실행되기 전에 참조가 불가능하다.
cosnt 키워드
let키워드
console.log(a); // 1
try{
console.log(b); // undefined
console.log(c); // undefined
} catch {};
var a = 1;
const b= 2;
let c;
console.log(b); // 2
console.log(c); // undefined
변수 네이밍 컨벤션
컴퓨텉는 데이터를 어떻게 처리할까?
데이터 타입은 언어마다 다르다.
자바스크립트의 데이터 타입
Nuber Type
0.1 + 0.2 = 0.3이 성립하지 않는 문제가 있다.배정밀도 64비트 부동소수점
아까 말한 0.1 + 0.2 = 0.3이 성립하지 않는 문제가 있다. 이는 실수를 연산할 때, 근사값으로 처리하기 때문이다.
숫자형에는 이 외에도 2가지가 존재한다.
BigInt Type
String Type
`My name is ${ 표현식}` Boolean Type
Undefined Type
여러 형태의 객체 타입
명시적 타입 변환
원시 래퍼 객체를 활용하여 개발자가 의도적으로 타입을 변경할 수 있다.
암묵적 타입 변환
개발자가 의도하지 않았지만, 타입이 변경될 때
값이 전달될 때, 참조되어있는 변수 값 타입이 개발자의 의도와 다르게 암묵적 타입변환으로 변경될 가능성이 있다.
그래서 타입추론이 어려워져, 불필요한 디버깅 시간 발생한다.
이를 해결하기 위해서 typeof나 일치연산자를 사용하여 타입 가드 구현하거나, 타입스크립트 이용할 수 있다.
연산자란?
하나 이상의 표현식을 대상으로 연산을 수행하여 하나의 값을 만든다.
단항 연산자
하나의 피연산자만을 사용하는 연산자
산술 연산자
두 개의 숫자 값(리터럴 또는 변수)을 피연산자로 받아서 하나의 숫자 값을 반환한다.
++: 숫자 1을 증가시키고, 증가시킨 값을 암묵적으로 할당한다.--: 숫자 1을 감소시키고, 증가시킨 값을 암묵적으로 할당한다.+: 양수의 표현, 아무런 효과가 없다.-: 양수를 음수로, 음수를 양수로 반전시킨 값을 반환한다.+ 덧셈- 뺄셈* 곱셈/ 나눗셈% 나머지관계 연산자
피 연산자를 비교하고, 결과가 참인지에 따라 boolean 값을 반환한다.
in: 객체 내에 속성이 존재할 경우 trur를 반환instanceof: 특정 객체 타입에 속하면 true를 반환, 가드 형태로 사용됨비교 연산자
피연산자를 비교하고, 결과가 참인지에 따라 boolean값을 반환한다. 피연산자에는 숫자, 문자열, 논리형, 객체타입
== 동등 연산자: 서로 값으면 true=== 일치 연산자: 사로 같고, 타입도 같으면 true!= 부등 연산자: 서로 다르면 true!== 불일치 연산자: 서로 다르고, 타입도 다르면 true> 큼 연산자: 왼쪽이 오른쪽보다 크면 true>= 크거나 같음 연산자: 왼쪽이 오른쪽 보다 크거나 같으면 true논리 연산자
두 개의 피연산자 중 하나를 반환
반한되 값이 무조건 boolean값이 아니다.
단축평가 논리: 첫번째 식을 평가한 결과에 따라서, 두번째 식 평가를 실행
만약 null, undefined, 빈 문자열이 들어오면 false로 평가된다.
기타 연산자들
+=: 더하기 할당-=: 빼기 할당*=: 곱하기 할당/=: 나누기 할당%=: 나머지 할당**=: 거듭제곱 할당&&=: 논리 AND 할당||=: 논리 OR 할당조건문 ? 참일 경우 반환: 거짓일 경우 반환동일한 처리를 해야 하는 경우에 함수를 사용함
예를 들어 n번의 횟수만큼 3을 더해야하는 로직을 생성할때, 중복 코드가 발생하고, 가독성도 떨어짐
이러한 문제를 해결해 주는게 함수임
함수란?
소프투에어에서 특정 동작을 수행하는 코드 일부분을 의미
외부 코드가 "호출"할 수 있는 하위 프로그램
함수명()함수의 형태
JavaScript의 함수
자바스크립트에서 함수는 객체처럼 속성과 메서드를 가질 수 있음
객체와의 차이점은 함수는 외부에서 "호출"이 가능하다는 점임, 객체는 못함
또, 자바스크립트 함수는 일급객체의 특징을 모두 가지고 있음
일급 객체
다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.
일급 객체는 함수의 실제 매개변수가 될 수 있다.
function foo(input) {
return input +1;
}
function bar() {
return 1;
}
foo(bar); // foo(1) -> 1 + 1 -> 2
일급 객체는 함수의 반환값이 될 수 있다.
function foo(input) {
return input +1;
}
function bar() {
return 1;
}
function baz() {
return bar;
}
foo(baz); // foo(bar) -> foo(1) -> 1 + 1 -> 2
일급 객체는 할당명령문의 대상이 될 수 있다. (변수 등에 할당 가능)
일급 객체는 동일 비교의 대상이 될 수 있다. (값으로 표현 가능)
const foo = function foo(input) {
return input +1;
}
foo(1); // input + 1 -> 2
함수의 형태
function addAge(age) {
if (typeof age !== 'number') return age
return age + 5
매개변수 parameter
기본값 매개변수
매개변수 값이 없거나, undefined가 전달될 경우 대체되는 초기값
매개변수에 할당연사자와 함계 초기값을 할당
function foo(arg = 1) {
return arg;
}
foo(); // arg = 1 -> 1
나머지 매개변수
가변항 함수
spread 연산자
function foo(arg, ...rest){
console.log(rest);
return arg;
foo('a','b','c');
// ['b','c']
// 'a'
arguments 객체: 함수에 전달되는 인자들을 참조할 수 있는 객체
let foo;
function bar(arg, ...rest){
console.log(arguments)
return arg
}
bar(1,2,3)
// Arguemtns(3) [1, 2, 3, callee: (...), Symbol(Symbol.iterlater...
foo.forEach(item => console.log(item))
// Uncaught TypeError: Cannot read properties of undefined (reading 'forEach')...
매개변수(parameter)와 인자(arguments)의 차이
매개변수: 함수를 정의할 때 사용하는 변수
인자: 함수가 호출될 때 넘기는 값
function 함수( 매개변수, ... 나머지_매개변수) {
console.log(나머지_매개변수);
reutnr 매개변수;
}
함수();
// []
// undefind
함수(1);
// []
// 1
함수('a','b','c');
// ['b','c']
// "a"
함수 생성 방법
함수 선언문
function foo(arg){
return arg;
}
const bar = foo(1);
console.log(bar) // 1
const foo = function(arg){
return arg;
}
const bar = function bar(arg){
return arg;
}
const temp = foo(1);
console.log(temp);
// 1
console.log(baz(1));
// ReferenceError: baz is not defined
```
Function 생성자 함수: 자바스크립트 내장 객체 중 하나
new 내장객체() new Function(arg1, arg2, ..., 'return 1')화살표 함수
ES6부터 사용 가능한 함수 선언문
function키워드 사용하지 않고, 화살표 사용
const foo = (arg) =>{
return arg();
}
foo(() =>{
return 1;
})
함수 사용 패턴
IIFE(즉시 실행 함수)
함수 정의와 동시에 실행
코드 평가 -> 코드 실행 -> 최초 1회 실행
작성방법
(function (){
return 1;
})();재귀함수
Recursive function 자기자신을 호출하는 하뭇
계속 자기을 참조하여 호출하므로 무한히 호출될 수 있음
직관성이 떨어질 수 있어, 한정적 사용 권장
function foo(arg){
if (arg === 3) return arg;
console.log(arg);
foo(arg + 1);
}
foo(1);
// 1
// 2
중첩함수
inner funtion 내부함수
내부함수 내의 변수 참조 -> 부모를 포함한 외부 범위 참조 가능
부모함수 내의 변수 참조 -> 자식 범위 참조 불가능
스코프 체인과 관련있음
콜백함수
Callaback function
함수 매개변수가 될 수 있다.
특정 이벤트가 발생했을 때, 시스템에 의해 호출되는 함수
const foo = (arg) => {
return arg();
}
foo(()=>{
return 1;
})