언어 및 도구들 공부/Javascript

const keys = Object.keys(survivedData).sort();

Dr.Mlem 2024. 12. 12. 15:03

Q1.

const keys = Object.keys(survivedData).sort(); 라는 코드가 있어.

여기서, Object.keys의 keys와, const keys의 keys는 다른것이지?

다르다면 어떻게 다른지 예시를 들어서 설명해줘.

 
ChatGPT
 

네, 둘은 전혀 다른 것입니다.

  • Object.keys: Object라는 전역 객체에 속한 정적 메서드로, 특정 객체를 인자로 받아 해당 객체의 열거 가능한(enumerable) 속성 key들을 배열 형태로 반환합니다.
  • const keys: 코드에서 const keys = Object.keys(survivedData).sort();와 같이 선언된 keys는 Object.keys(survivedData)를 호출한 결과(즉, survivedData의 key 배열)를 정렬한 뒤 그 결과 배열을 담은 지역 변수입니다. 즉, 이 변수는 직접 만든 이름이며, Object.keys라는 메서드와 이름이 우연히 같을 뿐 서로 아무런 관련이 없습니다.

예를 들어,

const person = { name: 'Alice', age: 30 };
const keys = Object.keys(person); // ["name", "age"]

여기서 Object.keys는 함수이고, keys는 person 객체의 key들을 담은 배열입니다. 만약 다른 이름을 사용한다면 예를 들어:

const personKeys = Object.keys(person); // ["name", "age"]

이렇게 해도 문제 없으며, personKeys나 keys나 모두 단지 변수 이름일 뿐이고, Object.keys라는 메서드와는 완전히 다른 개념입니다.

 

 

 

Q2.

나의 말:
Object.keys 메서드가 인자로 받는 특정 객체라 함은 Json 구조를 가지고 있는 대상을 말하는 것인가?
 
 
 
A2.
ChatGPT
 

아닙니다. Object.keys 메서드가 받는 인자는 꼭 JSON 구조를 가진 객체일 필요는 없습니다. 여기서 "특정 객체"란 자바스크립트에서 object 타입으로 취급되는 모든 값을 의미합니다. 즉, 일반적인 JavaScript 객체, 배열, 함수의 프로토타입 객체 등, key-value 형태의 속성을 가진 어떤 객체든지 인자로 전달할 수 있습니다.

  • 예를 들어,
const obj = { a: 1, b: 2 };
const arr = ['apple', 'banana'];

console.log(Object.keys(obj)); // ['a', 'b']
console.log(Object.keys(arr)); // ['0', '1']

이처럼 Object.keys는 JSON 형태로 명시된 문자열이 아니라, 자바스크립트 런타임에서 객체로 다뤄지는 대상의 key들을 반환하는 메서드입니다.

 
 
 
Q3.

나의 말:

어떤 대상에게 key가 있는지 없는지 어떻게 알지?
 
 
 
A3.
ChatGPT
 

자바스크립트에서 "key"는 객체의 프로퍼티 이름을 가리킵니다. 즉, 대상이 객체이고 그 안에 프로퍼티가 있다면 그 프로퍼티 이름이 key가 됩니다. 어떤 대상에 key가 있는지 확인하는 방법은 다음과 같습니다.

1. Object.keys 사용:
Object.keys(대상)을 호출하면 대상 객체의 열거 가능한(Enumerable) own property들의 key 배열을 반환합니다.

const obj = { name: 'Alice', age: 30 };
console.log(Object.keys(obj)); // ['name', 'age']

const emptyObj = {};
console.log(Object.keys(emptyObj)); // []
반환된 배열의 길이가 0이면, 해당 객체는 key를 가지고 있지 않은 것입니다.
 

2. for...in 문 사용:
for...in 문을 통해 객체 내의 열거 가능한 key를 순회할 수 있습니다.

const obj = { name: 'Alice', age: 30 };
for (const key in obj) {
  console.log(key); // 'name', 'age'
}

const emptyObj = {};
for (const key in emptyObj) {
  // 아무 것도 출력되지 않음
}

 

3. in 연산자 사용:
특정 key가 대상 객체 안에 존재하는지 여부를 체크할 수 있습니다.

const obj = { name: 'Alice' };
console.log('name' in obj); // true
console.log('age' in obj);  // false
 

이러한 방법을 통해 대상에 key(프로퍼티)가 존재하는지 확인할 수 있습니다. 단, primitives(숫자, 문자열, boolean 등)나 null, undefined 같은 값에는 key라는 개념이 적용되지 않습니다.

 

 

 

 

Q4.

나의 말:

JS에는 기본 데이터 타입이 있는가?

 
 
 
A4.
ChatGPT
 
네, JavaScript에는 기본(원시) 데이터 타입이 있습니다. ECMAScript 사양에 따르면 JavaScript의 원시 데이터 타입은 다음과 같습니다.
  1. Number: 모든 실수 및 정수 값을 나타냅니다. (예: 42, 3.14)
  2. String: 텍스트 데이터를 나타내는 문자열 타입입니다. (예: "Hello", 'World')
  3. Boolean: 논리적 참(true) 또는 거짓(false)을 나타내는 타입입니다.
  4. Null: 명시적으로 “값이 없음”을 나타내는 단일 값 null입니다.
  5. Undefined: 값이 할당되지 않은 변수를 나타내는 타입으로, 기본값은 undefined입니다.
  6. Symbol: 유일하고 변경 불가능한 식별자를 나타내는 타입입니다. (ES6에서 추가)
  7. BigInt: 안전한 정수 범위를 초과하는 큰 정수를 나타내는 타입입니다. (ES2020에서 추가)

이러한 원시 타입들 외에, 객체(Object) 타입이 있으며 객체는 원시 타입이 아닌 복합 자료형으로 취급됩니다.

 
 
 
Q5

나의 말:

그렇다면, Object.keys 함수는 위에서 열거한 기본 데이터 타입을 제외한 대상에는 사용할 수 있는 것인가?

 
 
 
A5.
ChatGPT
 

Object.keys() 함수는 원시(기본) 데이터 타입인 null 또는 undefined에 대해서는 에러를 발생시킵니다만, 그 외의 대부분의 경우 대상값을 객체로 변환하여 작동합니다. 즉, Object.keys()는 기본 데이터 타입을 제외한 "객체"에 주로 사용하지만, 문자열과 같이 원시값이더라도 내부적으로 객체처럼 동작할 수 있는 경우엔 대응되는 프로퍼티(인덱스)를 반환할 수 있습니다.

정리하자면:

  • 객체(일반 객체, 배열, 함수 등의 객체): 해당 객체의 열거 가능한 own property key를 배열로 반환합니다.
  • 문자열: 문자열은 원시 타입이지만, Object.keys('Hello')와 같이 하면 문자열을 래핑한 String 객체의 인덱스가 key로 반환됩니다. 예: Object.keys('Hello') → ['0', '1', '2', '3', '4']
  • 숫자, 불리언: Number나 Boolean의 경우, 기본적으로 그 자체에 열거 가능한 프로퍼티가 없으므로 Object.keys()를 호출하면 빈 배열을 반환합니다.
  • null, undefined: 이 둘은 객체로 변환할 수 없기 때문에 Object.keys(null)이나 Object.keys(undefined)는 TypeError를 발생시킵니다.

즉, 원시 타입 중 null, undefined를 제외하면 Object.keys()를 호출하는 것은 가능하지만, 의미 있는 key를 반환하는 것은 주로 진짜 "객체"일 때입니다.

 
 
 
Q6.

나의 말:

다시 처음으로 돌아와서, Object.keys 함수는 만들어진 의의를 제대로 활용하기 위해서는, 객체를 대상으로 써야하고, 그러면 해당 객체 내의 프로퍼티 이름들이 담긴 배열을 반환하는 것이란 말이지?

 
 
 
A6.
ChatGPT

네, 정확히 이해하신 내용입니다. Object.keys() 함수는 기본적으로 객체를 대상으로 사용하며, 그 객체에 직접 정의된(own) 열거 가능한(enumerable) 프로퍼티의 이름들을 배열로 반환하는 메서드입니다. 이를 통해 객체 내의 프로퍼티 키 목록을 쉽게 얻을 수 있습니다.

 

 

 

Q7.

배열도 키-값 형태의 속성을 가지고 있는 객체인 것인가?

 
 
 
A7.
 

네, 자바스크립트에서 배열은 특수한 형태의 객체입니다. 배열은 사실상 프로퍼티(속성)로 접근 가능한 인덱스를 가지며, 그 인덱스(0, 1, 2, ...)들이 결국 key처럼 동작합니다. 즉, 배열 역시 객체이므로 key–value 형태의 속성이 있지만, 일반 객체와는 달리 주로 연속적인 정수 인덱스를 통해 값을 관리하고, 배열 메서드(push, pop, shift, map, forEach 등)를 통해 효율적으로 데이터에 접근하고 조작할 수 있도록 설계된 특별한 객체입니다.