본문으로 건너뛰기

Ch4. 강제변환

4.1 값 변환

  • 타입 캐스팅: 명시적 형변환 (String(a), Number(b))
  • 강제변환(Coercion): 암시적 변환 (a + "", !!a)
var a = 42;
var b = a + ""; // 암시적
var c = String(a); // 명시적

4.2 추상 연산

4.2.1 ToString

null -> "null"
undefined -> "undefined"
true -> "true"
[1, 2, 3] -> "1,2,3"
{ a: 1 } -> "[object Object]"

JSON.stringify 의 특징:

JSON.stringify([1, undefined, function() {}, 4]); // "[1,null,null,4]"
JSON.stringify({ a: 1, b: undefined }); // "{"a":1}"

toJSON이 있으면 먼저 호출됨.


4.2.2 ToNumber

true -> 1
false -> 0
undefined -> NaN
null -> 0

객체는 valueOf()toString() 순으로 시도 후 변환:

var a = {
valueOf() { return "28"; }
};
Number(a); // 28

4.2.3 ToBoolean

  • falsy: 0, -0, NaN, "", null, undefined, false
  • truthy: 나머지 전부

document.all은 유일한 falsy 객체 (레거시)


4.3 명시적 강제변환

Number("42"); // 42
String(100); // "100"
Boolean(0); // false

new 키워드는 필요 없음. 사용 지양.


4.4 암시적 강제변환

4.4.2 문자열 ↔ 숫자

"5" * 2; // 10
"5" + 2; // "52"

4.4.5 && 와 ||

var a = 42;
var b = "abc";
var c = null;

a || b; // 42
a && b; // "abc"
c || b; // "abc"
c && b; // null

→ boolean이 아닌 값을 반환하는 선택 연산자처럼 작동


4.4.6 Symbol의 강제변환

var s1 = Symbol("s");
String(s1); // OK
s1 + ""; // TypeError

4.5 동등 비교

  • ==: 느슨한 비교 (타입 강제 변환 발생)
  • ===: 엄격한 비교 (타입 비교까지 포함)
0 == "0"; // true
0 === "0"; // false
  • NaN === NaN: false
  • Object.is(NaN, NaN): true

4.6 추상 관계 비교

[42] < ["43"]; // true
["43"] < [42]; // false

→ 배열은 문자열로 변환되어 비교됨


4.7 정리

  • 명시적 변환은 명확하므로 선호
  • 암시적 변환은 JavaScript의 유연함이지만, 혼란을 야기할 수 있음
  • JSON.stringify, ToPrimitive 등 추상 연산의 흐름을 이해하자