자바스크립트에서 객체가 메모리상에 저장되는 방법은 여기서 확인할 수 있다.
간단하게 설명하면, 간단한 변수의 경우는 데이터 영역
에 일정 공간을 할당 받아서 저장되고, 객체의 경우는 변수 영역
에 key/value
형태로 저장되는데 이 때 value
는 객체의 value가 아니라 메모리에서 가리키고 있는 데이터 영역
을 가리킨다. 그리고 이 데이터 영역에서 가리킨 또다른 객체만의 변수영역에서 비로서 객체의 key/value
값을 지정한다.
때문에 const a = {};
와 const b = {};
는 비록 할당된 데이터는 같을지라도 객체로 할당되어있기 때문에 a는 a만의 변수 영역을 할당받고, b는 b만의 변수 영역을 할당받기때문에 메모리 주소상 위치가 달라
둘의 값은 다르다.
자, 그림 이제 어떻게 자바스크립트는 객체를 비교하는지 알아보자.
객체(obj
)에 Object.entries(obj)
를 적용하면 obj 객체에 저장된 key/value
쌍들이 "[key, value]" 형태로 묶인 배열
이 반환된다. 하지만 배열 또한 객체이기때문에 이 배열을 Array.prototype.toString()을 통해 String
으로 변환하면 비로서 ===
을 통해 비교할 수 있게 된다.
이 메서드도 첫 번째의 방법과 동일하다. 객체를 string으로 변경해서 ===
을 통해 비교가 가능하도록 만들어준다. 실제 프로젝트에서 유용하게 사용된다고 한다고 한다..
알고리즘 문제를 풀면서 위 두 방식으로 객체가 비어있는지 확인을 했다. 하지만 결국 객체의 모든 프로퍼티를 확인하는 두 메서드는 상당한 리소스를 잡아먹는 함수라고 하더라.. 때문에 그래프를 사용하면서 비선형 자료구조인 객체를 사용하지 않을 수 없었고, 짱구를 굴리다가 어차피 객체가 빈 상황
만을 확인하면 되기때문에 len
이라는 프로퍼티를 추가해서 key가 delete
될때마다 -1
해줌으로 0
이 되었을 때 비로서 빈것을 확인할 수 있도록 했다. 결과적으로는 시간 초과가 났던 문제를 해결할 수 있었다.
function Graph() {
this.items = {}
this.len = {}
}
Graph.prototype.addVertex = function (v) {
this.items[v] = {};
this.len[v] = 0;
}
Graph.prototype.addEdge = function (from, to) {
this.items[from][to] = true;
this.len[from] += 1;
}
...
delete to_graph.items[t_node][f_node];
to_graph.len[t_node] -= 1;
if (to_graph.len[t_node] === 0){
// if (Object.keys(to_graph.items[t_node]).length === 0) {
q.enque(t_node)
time[t_node] += temp[t_node];
}
위의 전체 코드는 여기서 확인할 수 있다.