
데브코스 Node.js 강의를 듣던 중 강사님이 JS에서는 문자열도 객체라는 말씀을 하셨습니다.
JS에서 문자열은 원시 데이터 타입인걸로 알고있었는데 좀 혼란스럽더라구요.
그래서 문자열이 객체인지 궁금해져서 이것저것 좀 찾아본 결과를 정리했습니다.
JavaScript에서 데이터 타입은 크게 원시 데이터 타입과 객체 데이터 타입의 두가지로 나뉩니다.
"Hello, World!"42, 3.149007199254740991ntrue와 false를 나타냅니다.{ name: "Alice", age: 30 }[1, 2, 3]그런데 우리는 JavaScript에서 원시 데이터 타입인 문자열에 대해 .length나 .toUpperCase()와 같은 프로퍼티와 메소드를 사용할 수 있습니다.
이는 마치 원시 데이터 타입이 객체처럼 동작하는 것처럼 보이게 합니다.
let myString = "hello";
console.log(myString.toUpperCase()); // "HELLO"
이렇게 원시 데이터 타입을 객체처럼 사용할 수 있는 이유는 JavaScript 엔진이 자동으로 원시 값을 해당하는 래퍼 객체로 임시 변환하기 때문입니다.
다른 원시 데이터 타입인 Number, Boolean, BigInt, Symbol 등도 사용자가 프로퍼티나 메소드를 사용할 때 동일한 과정을 거칩니다.
원시 값에 대해 객체처럼 메서드를 호출하거나 속성에 접근하려고 할 때, 자바스크립트 엔진은 자동으로 해당 원시 값을 래퍼 객체로 변환합니다.
예를 들어, 문자열 원시 타입에 대한 래퍼 객체는 String 객체입니다.
다른 원시 데이터 타입도 각각 Number, Boolean, BigInt, Symbol 등의 래퍼 객체를 가집니다.
원시 데이터 타입을 객체처럼 사용할 때 임시적으로 사용된 래퍼 객체는 재사용 되지 않으며, 사용 후 가비지 컬렉터에 의해 자동으로 메모리에서 제거됩니다.
결론적으로, JavaScript에서 문자열은 기본적으로 원시 데이터 타입이며, 객체가 아닙니다.
그러나 JavaScript의 유연성 덕분에, 이 원시 타입은 필요한 경우 객체처럼 다루어질 수 있습니다.
이는 내부적으로 JavaScript 엔진에 의해 래퍼 객체를 통해 이루어지는 일시적인 변환이며, 실제로 문자열이 객체 데이터 타입으로 변하는 것은 아닙니다.
따라서 JS에서 문자열(String)은 본질적으로 객체가 아니라 원시 데이터 타입이라는 것을 알 수 있었습니다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Data_structures
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String#string_coercion
https://developer-talk.tistory.com/69