javascript 는 5가지 원시 데이터형 값을 가진다.
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 객체를 생성하기 때문에 처음 감싸진 래퍼 객체를 갱신하더라도 효과는 지속되지 않는다. 결국 원시값에 프로퍼티를 설정할 수 없다.
이 실수를 프로그램은 조용히 무시할 것이다. 이는 발견하기 어려운 오류를 자주 발생시켜 분석하기 어렵게 만든다.