let iAm = 123; // 숫자
iAm = '문자'; // 문자열
원시 타입의 값은 변경 불가능한 값(Immutable value)이며 pass-by-value(값에 의한 전달) 이다.
Immutable value란?
- 변경이 불가능 한 값(primitive value)
재할당은 가능하지만 메모리 영역에서의 변경이 불가능위와 같이 변수의 값 재할당이 가능하지만, 'Hello'의 'H'만을 'A'로 바꾸는 등 값의 변경은 불가능하다.let str = 'Hello'; str = 'world';
pass-by-value란?
- 원시 타입은 값으로 전달 된다. 즉, 값이 복사 되어 전달된다. (원시 타입은 값이 한번 정해지면 변경이 불가능)
let a = 1; // a에 원시 타입 숫자 1 할당 let b = a; // b에 a을 할당 할 경우 a의 값이 복사되어 b에 저장 console.log(a,b); // a = 1, b = 1 a = 10; // a에 10을 재할당 할 경우 console.log(a,b); // a = 10, b = 1
- 2행에서 변수 b의 값은 1행의 변수 a의 값인 1을 복사해서 할당했기 때문에,
4행에서 a의 값을 재할당한다 해도 b의 값은 변하지 않음let obj = { a: 1, b: 2, }; let obj2 = obj; // obj2에 obj의 객체가 저장된 주소만 복사(참조) console.log(obj,obj2); // {a:1, b:2}, {a:1, b:2} obj2.a = 999; console.log(obj,obj2); // {a:999, b:2}, {a:999, b:2}
- 위의 예시와 달리 obj, obj2는 원시 타입이 아닌 객체타입이기 때문에
5행에서 obj2는 obj의 주소를 복사해 값을 참조함
7행에서 obj2의 프로퍼티 a 값을 999로 변경하게 되면
obj의 주소와 매칭되어있는 obj2의 값이 변경되기 때문에
8행에서와 같이 obj.a, obj2.a의 값이 모두 변경됨
let num = 1;
num = 1.234;
Infinity
양의 무한대, -Infinity
음의 무한대, NaN
Not-A-Number 가 있다.console.log(1 / 0); // Infinity 어떤 숫자든 0으로 나누면 무한대
console.log('string' / 2); // NaN 부정확하거나 정의되지 않은 수학 연산 사용
BigInt
형 값은 숫자열 끝에 n
을 붙여 만들 수 있다.BigInt
함수를 호출해 사용할 수 있다.let BigInt = 1234567890123456789012345678901234567890n;
let BigInt2 = BigInt(1234567890123456789012345678901234567890);
let str = 'Hello';
let str1 = "My Name is Kane";
let str2 = `${str} World! ${str1}`;
1 + 1
과 같은 수학 관련 표현식을 작성 가능.let str = 'Hello';
console.log(str[0]); // 'H'
// 유사 배열이지만 문자열은 원시타입 즉, 값을 변경할 수 없음
str[0] = 'A';
console.log(str); // 'Hello'
true
, 거짓 false
두가지 밖에 없다.let str = '';
let str1 = 'Hello';
console.log(Boolean(str)); // false
console.log(Boolean(str1)); // true
null
, undefined
, 숫자 0
은 false
로 간주.undefined
는 변수가 선언이 되었지만 값을 할당하지 않은 경우 반환된다.let name;
console.log(name); // undefined
null
은 값이 없음을 의미한다.let age = 29;
age = null; // 참조 정보가 제거
symbol
심볼은 ES6에서 새롭게 추가되었다.Symbol
함수를 호출해 생성하는데 이때 생성된 심볼 값은 다른 심볼 값과 다른 유일한 심볼 값이다let key = Symbol('key');
console.log(key); // symbol
let obj = {};
obj[key] = 'value';
console.log(obj[key]); // value
자바스크립트는 객체 기반의 스크립트 언어이며 객체는 자바스크립트를 이루고있는 거의 "모든것"이다. 원시 타입을 제외한 나머지 값들(function
함수, array
배열, 정규표현식 등)은 모두 객체이다.
객체(Object)는 키(Key)와 값(Value)으로 구성된 프로퍼티(Property)들의 집합.
프로퍼티의 값으로 자바스크립트에서 사용할 수 있는 모든 값을 사용할 수 있는데,
자바스크립트의 함수는 일급 객체이므로 값으로 취급할 수 있다.
따라서 프로퍼티 값으로 함수를 사용할 수도있으며 프로퍼티 값이 함수일 경우,
일반 함수와 구분하기 위해 Method
메소드라 부른다.
일급 객체(First-class Object)
다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.
- 일급객체의 조건
- 변수나 상수에 저장 및 할당할 수 있어야 한다.
- 파라미터(객체의 인자)로 전달할 수 있어야 한다.
- 함수의 반환 값으로 사용될 수 있어야 한다.
- 일급객체의 사용
callback
콜백 사용 가능- 고차 함수를 만들 수 있다.
이와 같이 객체는 데이터를 의미하는 프로퍼티와 데이터를 참조하고 조작할 수 있는 동작을 의미하는 메소드로 구성된 집합.
프로퍼티
- 프로퍼티 키와 프로퍼티 값으로 구성됨.
- 프로퍼티는 프로퍼티 키로 유일하게 식별할 수 있다.
즉, 프로퍼티 키는 프로퍼티를 식별하기 위한 식별자.
- 프로퍼티 키의 명명 규칙과 프로퍼티 값으로 사용할 수 있는 값
프로퍼티 키 : 빈 문자열을 포함하는 모든 문자열 또는symbol
값
프로퍼티 값 : 모든 값- 프로퍼티 키에 문자열이나
symbol
값이나 이외의 값을 지정하면 암묵적으로 타입이 변환되어 문자열이 된다.- 이미 존재하는 프로퍼티 키를 중복 선언하면 나중에 선언한 프로퍼티가 먼저 선언한 프로퍼티를 덮어쓴다.
- 배열과 달리 객체는 프로퍼티를 열거할 때 순서를 보장하지 않는다.
메소드
- 프로퍼티 값이 함수일 경우, 일반 함수와 구분하기 위해 메소드라 부른다
즉, 메소드는 객체에 제한되어 있는 함수를 의미
참고 문헌
PoiemaWeb: 웹 프로그래밍 튜토리얼 https://poiemaweb.com
모던 JavaScript 튜토리얼 https://ko.javascript.info
벨로퍼트와 함께하는 모던 자바스크립트 https://learnjs.vlpt.us
MDN https://developer.mozilla.org/ko/