4. 강제변환_1

악음·2021년 8월 2일
0

i will know javascript

목록 보기
9/12
post-thumbnail

지금까지 자바스크립트의 타입/값에 대해 충분히 살펴보았다.
이제 앞서 말했던 강제변환을 배워보자

말도많고 탈도많은 기능이지만 제대로 알고 쓸수있도록 공부해보자

4.1 값변환

어떤 값을 다른 타입의 값으로 바꾸는 과정중에

  • 명시적이면 타입캐스팅 (정적 언어에 컴파일시점)
  • 암시적이면 강제변환 (동적 언어의 런타임 시점)
  • 3장에 나온 박싱은 가제변환이 아니다.(해당 객채를 감싸는것뿐)

이 책에선 자바스크립트의 타입변환을 암시적 강제변환 / 명싲거 강제변환 두가지로 구별한다.

차이는 명확하다 명시적 강제변환은 의도적이고
암시적 강제변환은 불분명한 부수효과로 부터 발생한다.

let a =42
let b =a+""
b// "42"
let c=String(a) 
c //"42"
  • 여기서 B에는 암시적 강제변환이 발생한다 문자열과 숫자의 +연산은 "문자열 접합"처리를 의미한다.
  • 이와 대조적으로 String()함수는 값을 인자로 받아 명백히 문자열 타입으로 강제변환한다.

위에 두가지 방법 모두 42 를 "42"으로 바꾸는데 여기서 논란은 변환을 어떻게 할 것이냐 라는 문제다 (코딩 스타일뿐만아니라 작동방식도 미묘한 차이가 있다)

명시적 = 명백한
암시적 = 숨겨진 부수효과
이러한 대응 관계가 성립한다.

하지만 위에 코드를 보면 2가지 부류가 나뉠수도있다.
""을 더하면 문자열 접합을 통해 스트링으로 바뀐수있다는 것을 아는 사람들에게는
a의 경우야말로 명시적이라고 생각 할 수도 있고
String()을 보고 암시적이라고 생각할수도 있기때문이다.

여러가지 의견들이 있지만 좀더 깊게 배워보고 다시한번 판단해보자.

4.2 추상연산

여기서 어떤값이 명시적/암시적으로 변환되는지 알아보자
ES5 명세를 보면 변환 규칙의 추상연산이 정의되어있다.
ToString, ToNumber, ToBoolean을 집중적으로 알아보고 ToPrimitive을 알아보자

4.2.1 ToString()

문자열이 아닌값 을 문자열로 바꾸는 작없은 ES5 의 ToString()추상 연상 로직이 담당한다.
내장 원시 값을 본연의 문자열화 방법이 정해져 있다.
(null=>"null", undefined=>"undefinded", true=>"true" 숫자는 그냥 문자열로 바뀌고
너무 큰값이나 너무 작은 값은 지수 형태로 바뀐다)

let a =1.07 *1000*1000*1000*1000*1000*1000*1000
a.toString //'1.07e21'

일반 객체는 특별히 지정하지 않으면 기본적으로 (Object.prototype.toString())에 있는 toString() 매서드가 내부 [[CLASS]]를 반환다.
자신의 toString()메서드를 가진 객체는 문자열처럼 사용하면 자동으로 이 메서드가 기본 호출되어 toString()을 대체한다.
(정확히는 toPrimitive과정을 거친다)

배열은 기본적으로 재정의도니 toString()이 있다 문자열 변환 시 모든 원소값이 콤마현태로 분리된 문자배열이 리턴된다.

let a =[1,2,3]
a.toString() // "1,2,3"

또한 toString()메서드는 "명시적"으로도 호출 가능하며 문자열 콘텍스트에서 문자열 아닌 값이 있을경우에도 자동 호출된다.

JSON 문자열화

ToString은 JSON.stringify() 유틸리티를 사용하여 어떤 값을 JSON문자열로 직렬화하는 문제와도 연관된다.
JSON문자열화는 강제변환과 똑같지는 않지만 toString()규칙과 관련이 있다.

이는 "JSON안전값(JSON표현형 으로 확실히 나타낼수 있는값)"은 모두 JSON.stringify()로 문자열화 할 수있다.

JSON안전 값이 아닌 것들(undefined, 함수,심볼값)은 배열에 포함되어있으면 null으로 바꾸거나 객체프로퍼티에 있으면 간단히 지워버린다.

또한 JSON.stringify()에 환형 참조 객체를 넘기면 에러가난다.

  • 환형 참조 객체
    프로퍼티 참조가 무한 순환되는 구조의 객체,
    마지막 객체가 첫 번째 객체를 참조하는 등 순환 참조가 발생하여 결국 메모리 누수를 유발하는 객체.
var obj = {};
var a = {
  b: 10,
  c: obj
};
// 환영 참조 객체 만들기
 obj.test = a;

부적절한 JSON값이나 직렬화하기 곤란한 객체 값을 문자열화하려면 toJSON()메서드 를 따로 정의해야 한다.

profile
RN/react.js개발자이며 배운것들을 제가 보기위해서 정리하기 때문에 비속어 오타가 있을수있습니다.

0개의 댓글