[LeetCode] 2727. Is Object Empty
객체 혹은 배열이 비어있는지 확인하는 문제이다.
배열 혹은 객체의 키가 있는지 확인하면 되므로 Object.keys의 길이가 0인지 확인하면 된다.
만약 keys
로 추출 후 비교하는 것이 싫다면 아래와 같은 방법도 있다.
배열 또한 객체이므로 for...in
을 통해 속성 키값을 순회할 수 있는지 확인하면 된다.
keys
로 모든 키값을 가져와 비교하는 것보다 순회와 동시에 객체가 비어있는지 판단이 가능하므로 훨씬 빠르다.
참고로 이 문제는 "상속된" 프로퍼티를 비교해야 하는지에 대한 명시가 없어 모호한 부분이 있다.
만약 상속된 프로퍼티까지 비교한다면 keys
와 for-in
의 정답 여부가 달라졌을 것이다. 이 부분은 아래에서 다루겠다.
++ for-in
과 for-of
의 차이가 무엇일까?
for...in
for...in문은 상속된 열거 가능한 속성들을 포함하여 객체에서 문자열로 키가 지정된 모든 열거 가능한 속성에 대해 반복합니다(Symbol로 키가 지정된 속성은 무시합니다.).
MDN for...in 설명에 따르면 for...in
은 상속된 모든 속성(Property)을 포함한 속성 키 값을 반복한다.
for..of
for...of 명령문은 반복가능한 객체 (Array, Map, Set, String, TypedArray, arguments 객체 등을 포함)에 대해서 반복하고 각 개별 속성값에 대해 실행되는 문이 있는 사용자 정의 반복 후크를 호출하는 루프를 생성합니다.
MDN for...of 설명에 따르면 for...of
는 반복 가능한 객체의 속성 값에 대한 순회를 한다.
결론
for...in
루프는 객체의 모든 열거 가능한 속성에 대해 반복하며 문자열 키 값을 반환한다. 추가로 인덱스의 순서를 보장하지 않는다.
for...of
구문은 컬렉션 전용이다. 모든 객체보다는, [Symbol.iterator] 속성이 있는 모든 컬렉션 요소에 대해 반복하며 컬렉션을 반환한다.
keys
는 해당 키를 가져오지만, 상속된 값은 가져오지 않는다.