[Effective JavaScript] 객체 래퍼보다 원시 데이터형을 우선시하라

김범식·2023년 6월 14일
0

Effective JavaScript

목록 보기
22/33
post-thumbnail

javascript 는 5가지 원시 데이터형 값을 가진다.

  • boolean
  • number
  • string
  • null
  • undefined
var a = new String("hello")

typeof a // Objecg
typeof "hello" // string

둘은 전혀 다른 타입을 가진다. 즉

var a = new String("hello")
var b = new String("hello")

a === b //false
a == b //false

내장 연산자를 사용해 비교할 수 없다.

javascript는 문자열을 암묵적으로 위와같은 프로토타입 객체로 변경한다.

const str = 'Hello, World!';

console.log(str.length); // 문자열의 길이 출력 (13)

console.log(str.charAt(0)); // 인덱스 0의 문자 가져오기 ('H')

console.log(str.substring(0, 5)); // 인덱스 0부터 5 이전까지의 부분 문자열 반환 ('Hello')

console.log(str.split(', ')); // ', '를 기준으로 문자열 분할하여 배열 반환 (['Hello', 'World!'])

console.log(str.toUpperCase()); // 문자열을 대문자로 변환 ('HELLO, WORLD!')

때문에 다음과 같은 함수를 사용할 수 있게 되는것이다.

더불어 이런것도 가능하다.

"hello".someProperty = 17;
"hello".someProperty; // undifined

실제로는 원시 데이터형에 프로퍼티를 설정할 수 없지만 암묵적으로 프로토타입객체로 형변환 되면서 다음과 같은 작업이 가능해진다. 하지만 암묵적인 감싸기는 실행될때마다 매번 새로운 String 객체를 생성하기 때문에 처음 감싸진 래퍼 객체를 갱신하더라도 효과는 지속되지 않는다. 결국 원시값에 프로퍼티를 설정할 수 없다.

이 실수를 프로그램은 조용히 무시할 것이다. 이는 발견하기 어려운 오류를 자주 발생시켜 분석하기 어렵게 만든다.

기억할점

  • 원시 데이터형을 위한 객체 래퍼는 그 자신의 원시 데이터 값과는 동작이 다르다. 동일한지 비교했을 때도 서로 다르다.

- 원시 데이터형에 프로퍼티를 설정하거나 가져오면 암묵적으로 객체래퍼를 생성한다.

profile
frontend developer

0개의 댓글