어떤 값을 다른 타입의 값으로 바꾸는 과정이 명시적일 때
-> 타입 캐스팅(Type Casting)
(타입 캐스팅은 정적 타입언어에서 컴파일 시점에서 발생)
어떤 값을 다른 타입의 값으로 바꾸는 과정이 암시적일 때
-> 강제변환(Coercion)
(강제변환은 동적 타입 언어에서 런타임 시점에 발생)
그러나 자바스크립트에서는 대부분 모든 유형의 타입변환을 강제변환으로 뭉뚱그려 일컫는 경향이 있어서, '암시적 강제변환'과 '명시적 강제변환' 두가지로 구분한다
var a = 42;
var b = a + ""; // 암시적 강제변환
var c = String( a ); // 명시적 강제변환
b에 암시적 강제 변환이 발생한다.
공백 문자열( " ")과의 + 연산은 문자열 접합 처리를 의미하므로 숫자 42를 문자열 "42"로 강제변환한다.
반대로, String( ) 함수는 값을 인자로 받아 명백히 문자열 타입으로 강제변환한다.
두가지 접근 방식 모두 42를 "42"로 바꾸는데, 핵심은 바로 변환을 '어떻게'할 것이냐 하는 문제다.
'문자열이 아닌 값 -> 문자열' 변환 작업은 ToString 추상 연산 로직이 담당한다.
var a = 1.07 x 1000 x 1000 x 1000 x 1000 x 1000 x 1000 x 1000
a.toString(); // 1.07e21
일반 객체는 특별히 지정하지 않으면 기본적으로 toString( ) 메서드가 내부 [[Class]]를 반환한다.
자신의 toString( ) 메서드를 가진 객체는 문자열처럼 사용하면 자동으로 이 메서드가 기본 호출되어 toString( )을 대체한다.
var a = [1, 2, 3];
a.toString( ); // "1, 2, 3"
배열은 기본적으로 재정의된 toString()이 있다. 문자열 변환 시 모든 원소 값이 콤마로 분리된 형태로 이어진다.
ToString은 JSON.stringify() 유틸리티를 사용하여 어떤 값을 JSON 문자열로 직렬화하는 문제와도 연관된다.
JSON 문자열화는 강제변환과 같지는 않지만, ToString() 규칙과 관련이 있다.
JSON.stringify( 42 ); // "42"
JSON.stringify( "42" ); // ""42""
JSON.stringify( null ); // "null"
JSON.stringify( true ); // "true"
주석을 드래그하면 정답확인
JSON.stringify()는 인자가 undefined, 함수, 심벌 값이면 자동으로 누락시키며 이런 값들이 만약 배열에 포함되어 있으면 null로 바꾼다.
JSON.stringify( undefined ); //undefined
JSON.stringify( function(){}); //undefinedJSON.stringify(
[1, undefined, function(){}, 4]); // "[1, null, null, 4];JSON.stringify(
{ a : 2, b : function(){ } }
); // "{"a" : 2}"
객체 자체에 toJSON()메서드가 정의되어 있다면, 먼저 이 메서드를 호출하여 직렬화한 값을 반환한다.
부적절한 JSON 값이나 직렬화하기 곤란한 객체 값을 문자열화하려면 toJSON()메서드를 따로 정의해야 한다.
예를들면,
var o = { };
var a = { b : 42, c : o, d : function(){ } };
o.e = a; //'a'를 환형 참조 객체로 만듬
//환형 참조 객체는 JSON 문자열화 시 에러가 난다
//JSON.stringify( a );//JSON 값으로 직렬화하는 함수를 따로 정의한다.
a.toJSON = function() {
//직렬화에 프로퍼티 'b'만 포함시킨다.
return { b: this.b };
};
JSON.stringify( a ); // "{"b" : 42}"
참고도서 : You don't know JS