1. 모든 데이터는 json으로 저장된다고 생각해라
예를 들어서 형 string 변수가 있다고 해도 실제로 까보면 java의 string 클래스나 C 계열의 array 형태가 아니라 아래처럼 생겨먹었음
0: "t"
1: "e"
2: "s"
3: "t"
length: 4
[[Prototype]]: String
[[PrimitiveValue]]: "test"
걍 json(정확히는 Object형)으로 생겨먹었다고 생각하면 prototype 상속같은 뭔가 이질적인 동작도 대충 이해가 됨 ㅇㅇ
2. JS는 기성 언어와 class/function/variable 체계가 다르다
예를 들면 class는 function의 일종임
그래서 아래와 같이 function과 class를 거의 동일하게 사용하는것도 가능함 내부적으로
class TodoModel { // class 선언
constructor(data) {
this.todos = [];
this.data = data;
}
addData() {
console.log(`${data} addData`);
}
add() { console.log('add'); }
}
const todoModel = new TodoModel('input');
todoModel.addData();
function TodoModel(data){ // function 선언
const todos = [];
function addData() {
console.log(`${data} addData`);
}
function add() { console.log('add'); }
return Object.freeze({
addData,
});
}
const todoModel = new TodoModel('input');
todoModel.addData();
근데 더 웃긴건 1번의 내용과 어느정도 일맥상통하는 얘긴데 까보면 사실 둘 다 Object형의 variable이라는거임 ㅇㅇ
console.log(new TodoModel())
> 대충 prototype: Object 어쩌고 나옴
한 마디로 class고 function이고 하는 것들은 단지 "특별한 Object 변수" 이상도 이하도 아님 그래서 object형과 동일하게 사용 하는것이 가능함
3. JS의 =는 기본적으로 pointer를 넘긴다.
아래와 같은 경우
a = {n: 0}
b = a
b.n=10
console.log(a)
{n:10}이 출력된다 ㅇㅇ
왜 ㅇㅈㄹ이냐면 "="의 의미가 다른 기성 언어들과 조금 달라서 그럼
JS에서의 =는 "값을 복사"가 아닌 "해당 변수 참조"라고 이해 하면 된다.
위의 예제를 보면 b는 a를 참조하고, b.n은 곧 a.n을 의미하는것과 동일하다는 말임
const test = (num) => { const keys = Array(num).fill().map(()=>Math.random()); let start; const arr = []; const map = new Map(); start = Date.now(); keys.forEach(key => arr[key] = Math.random()); console.log('Array', Date.now() - start); start = Date.now(); keys.forEach(key => map.set(key, Math.random())); console.log('Map', Date.now() - start); } test(1e5);