자바스크립트의 모든 값은 데이터 타입(= 값의 종류)을 갖는다.
원시타입(primitive type)과 객체타입(object/reference type)으로 나뉜다.
변경 불가능한 값(immutablle value)으로, 한번 생성된 원시 값은 읽기 전용 값으로서 변경할 수 없다.
immutable example)
let a = 100;
let b = a;
b = 200;
console.log(a); // 100
console.log(b); // 200
즉, 두 변수의 원시 값은 서로 다른 메모리 공간에 저장된 별개의 값.
어느 한 쪽에서 재할당을 통해 값을 변경하더라도 서로 간섭할 수 없다!
(*원시 값 자체를 변경할 수 없다는 것이지, 변수는 언제든지 재할당을 통해 변수 값을 교체할 수 있다.)
정수, 실수와 상관 없이 하나의 숫자 타입만 존재.
1 * 'String'
텍스트 데이터로 작은/큰 따옴표 또는 백틱으로 텍스트를 감싼다.
+
연산자를 통해 문자열을 연결.// 1) using escape sequence and +
let name = 'suhyeon';
const text = 'hi.\nI\'m' + name;
console.log(text);
// hi.
// I'm suhyeon.
// 2) using template literal
const template = `
hi.
I'm ${name}.
`;
const str = 'hello';
console.log(str[0]); // h
console.log(str.length); // 5
str[0] = 'H';
console.log(str); // hello
논리적 참/거짓을 나타내는
true
와false
으로, 조건문에서 자주 사용.
자바스크립트 엔진이 변수를 초기화할 때 사용하는 값.
null
을 할당.const foo;
console.log(foo); // undefined
변수에 값이 없다는 것을 의도적으로 명시.
변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미.
(* 함수가 유효한 값을 반환할 수 없는 경우, null을 반환하기도 함.)
ES6에서 추가된 값으로, 다른 값과 중복되지 않는 유일무이한 값.
이름 충돌 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용.
const key = Symbol('key');
console.log(typeof key); // symbol
const obj = {};
obj[key] = 'value';
console.log(obj[key]); // value
변경 가능한 값(mutable value)으로, 재할당 없이 프로퍼티를 동적으로 추가/갱신/삭제할 수 있다.
const person = {
name: 'suu'
};
person.name = 'kim';
person.address = 'seoul';
console.log(person); // {name: 'kim', address: 'seoul'}
const obj = { x: {y: 1} };
// shallow copy
const shallowObj = { ...obj };
console.log(obj === shallowObj); // false
console.log(obj.x === shallowObj.x); // true
// deep copy
const _ = require('loadash');
const deepObj = _.cloneDeep(obj);
console.log(obj === deepObj); // false
console.log(obj.x === deepObj); // false
자바스크립트의 변수는 데이터 타입을 가지는게 아니라, 할당에 의해 타입이 결정된다.
재할당에 의해 변수의 타입이 언제든지 동적으로 변할 수 있다. (= 동적 타이핑)
*참고: 모던 자바스크립트 deep dive