자바스크립트의 거의 모든 것은 객체이다. (기본 데이터 타입을 제외 한 나머지)
함수도 객체이다(일반적인 객체보다 더 많은 기능을 가진 객체) => 일급객체(first class object)
모든 객체는 숨겨진 링크인 프로토타입을 가진다.
자신만의 독특한 과정으로 실행 컨텍스트를 만들고 그 안에서 실행이 이루어진다.
클래스를 지원하진 않지만 객체지향 프로그래밍이 가능하다.
함수형 프로그래밍이 가능하다
⚠️ 유연한 언어를 특성으로 가지며 이 때문에 디버깅이 어려울 수 있다.
⚠️ 최상위 레벨의 객체들이 모두 전역 객체 안에 존재 하기 때문에 이름 충돌의 위험성이 있다
느슨한 타입 체크 언어인 자바스크립트 변수 선언 할 때 var, let, const 세가지 키워드로 값을 할당함
var는 ES6에서 let 과 const가 나오기 전까지 변수를 선언하는 유일한 방법이였다
var로 선언된 변수는 값이 변경되면 기존에 선언된 변수의 값을 덮어쓰는 형식이다.
전역스코프가 아닌 특정 함수 내에서 var로 선언한 변수는 함수 스코프를 가진다.
var와 달리 재선언 불가능 → 예상치 못하게 기존 변수 값이 바뀌는 것을 방지함
함수스코프가 아닌 블록스코프를 가진다. 둘러싼 블록 안에서만 해당 변수에 접근 가능함
const는 값의 변경이 불가능. 변하지 않는 값을 선언할 때 사용
number, string, boolean, null, undefined, Symbol, BigInt
숫자
문자열
const ex1 = 'hello' + 'javascript';
//또는
const name = 'javascript';
const ex2 = `hello ${name}` ; //템플릿 리터럴
Symbol
BigInt
기본 타입을 제외한 모든 값 (배열, 함수, 정규표현식 등)
key : value 형태
기본타입은 하나의 값만 가지는 반면 참조타입은 여러개의 property를 포함
property는 기본타입 또는 다른 객체를 가리킬 수 있고 함수 또한 포함 할 수 있다.
1. Object() 생성자
var foo = new Object();
foo.name = 'foo';
foo.age = 30;
2. 객체 리터럴 방식
{ } 를 이용하여 객체 생성
{ } 안에 key(property name) : value(property value) 형식으로 property추가
property이름은 문자열 또는 숫자
property값은 어떤 표현식이든 가능, 값이 함수 일 경우 메서드라고 부름
var foo = {
name : 'foo',
age : 30
}
3. 생성자 함수
형식이 정해져있지 않음
일반 함수와 구분하기 위해 생성자 함수이름은 첫 글자를 대문자로 표기하는 것을 권장
function Vehicle(type) {
this.type = type;
}
const car = new Vehicle('Car');
[ ] 이용 → foo['name']
. 이용 → foo.name
⭐ [ ] 만 가능한 경우 : property이름이 표현식이거나 예약어일때
출력:
for in 문 사용
var prop;
for (prop in foo){
console.log(foo[prop])
};
삭제:
delete foo.name;
delete는 객체의 property는 삭제가 가능하나 객체 자체는 삭제 불가능
특성:
참조타입이라고 부르는 이유?
-> 객체의 모든 연산이 실제 값이 아닌 참조값으로 처리 되기 때문
var objA = {val : 40};
var objB = objA;
objB의 val값을 바꾸면 objA의 val값도 같이 바뀐다.
objB가 가리키고 있는 참조값이 objA가 가리키는 값과 같기 때문이다.
비교 (==)
property값이 아닌 참조값을 비교하는 동등 연산자
값에 의한 호출 (Call by value) vs. 참조에 의한 호출 (Call by reference)
1. Array() 생성자
const arr = new Array();
생성자 함수 안에 인자가 1개이고 숫자일 경우 배열의 길이를 뜻함 → 숫자만큼 길이의 빈 배열 생성
그 외에는 배열의 요소를 뜻함
2. 배열 리터럴
[ ] 사용
⭐ 배열에도 property추가 가능 → 하지만 배열 길이에 영향 X , 권장 X
희소배열
배열이 연속적이지 않고 중간에 빈 배열
배열 내장 메서드 사용시 빈 원소는 무시
빈원소는 undefined가 아닌 empty로 표시됨
특수한 경우가 아니라면 권장 X
배열원본데이터를 직접 수정하는 메서드 vs. 기존 데이터를 기반으로 새로운 배열을 생성하는 메서드
수정:
shift(): 첫번째 원소 삭제 후 삭제된 원소 값 반환
unshift() : 첫번째 인덱스에 원소 추가 후 배열의 새로운 길이 반환 (원소 여러개 추가 가능 ex. arr.shift(1, 4))
push(): unshift와 비슷하지만 첫번째 인덱스가 아닌 마지막에 추가
pop(): 마지막 원소 삭제 후 반환
splice(): 원소 추가,교체,삭제시 사용 ( splice(start, end, item) start : splice 시작, end : splice 끝나는 위치, item :삭제위치에 추가할 원소)
생성:
map():
배열의 모든 원소를 인자로 받은 함수의 특정한 형식으로 변경하여 새로운 배열의 생성하여 반환
const arr = [1,2,3];
cons newArr = arr.map(x => x + 1);
forEach():
인자로 받은 함수를 배열의 모든 원소를 대상으로 실행
const forEach = arr.forEach(x => console.log(x));
filter():
인자로 받은 함수의 테스트를 통과하는 원소들로 새로운 배열 생성 후 반환
const filter = arr.filter(x => x !== 1);
//filter값 = [2,3]
배열의 요소를 삭제할 때 delete 연산자를 사용한다. → 요소가 삭제되고 undefined가 할당 된다. 고로 length는 변하지 않는다.
요소를 완전히 삭제 할땐 splice를 사용한다.
일반 객체를 배열처럼 사용 할 수 있음
양의 정수인 length property를 가진 객체 ( 가장 대표적으로 arguments)
⚠️ 유사배열객체는 property를 배열처럼 인덱스로 접근 가능하지만 배열 내장 메서드를 사용 할 수 없다.
⭐ 배열 내장 메서드를 사용하기 위해서는 apply() 또는 call() 과 결합하여 사용해야한다
Truthy and Falsy 값
falsy값 ex)
기존 값을 boolean으로 변환 할 때 사용
동등연산자 : 암시적 강제 변환이 가능함. 피연산자의 타입이 다른경우 타입변환 후 비교.
→ 타입이 달라도 같은 값을 반환 할 수 있다면 동등하다고 판단
일치연산자: 암시적 강제변환 허용X
→ 피연산자들의 타입과 값 모두가 같아야 동등하다고 판단