ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [강제변환]
    Front-end/Javascript 2021. 4. 12. 23:32

    명시적 강제변환(explicit coercion ) : 의도적인 타입 변화 

    암시적 강제변환 (implicit coercion) : 작업 도중 사이드 이펙트로부터 발생하는 타입 변환 

    추상연산 : ToString,ToNumber,ToBoolean


    ToNumber

    숫자 아닌 값 -> 수식 연산이 가능한 숫자 변환 로직 

    true => 1 , false => 0, undefined => NaN, null => 0 ,

    object => 1.원시값으로 변환 후 그 값을 ToNumber(원시값) 으로 변환한다.

    원시값으로 변환 시  1)valueOf 메서드를 구현했으며 valueOf() 를 사용할수있고 반환값이 원시값이면 강제변환. 그렇지 않으면 toString()을 이용하여 강제변환. 원시값으로 변환하지 못할땐 type error가 발생한다.

     

    ToBoolean

    falsy: Boolean으로 강제변환시 false가 되는 경우의 수 => undefined, null, false, +0, -0, NaN, "" 

    Falsy 객체 : falsy 값을 감싼 객체 래퍼의 값은 어떻게 될까?

     

    truthy 값 : falsy 값 목록에 없으면 truthy값이다. 

    문자열값은 falsy 처럼 보이지만 문자열 값 자체는 모두 truthy이기 때문에 d는 true이다.

    if (true)
    if ({})
    if ([])
    if (42)
    if ("0")
    if ("false")
    if (new Date())
    if (-42)
    if (12n)
    if (3.14)
    if (-3.14)
    if (Infinity)
    if (-Infinity)

     


    명시적 강제변환

    가장 흔히 사용하는 변환이다.

    1. 문자열 <-> 숫자 강제변환 : String() 과 Number()함수를 이용하며, new 키워드가 붙지 않으므로 객체 래퍼를 생성하는것은 아니다.
    2. String.prototype.toString()

    이 방법은 명시적이지만, 원시 값 42에는 toString() 메서드가 없으므로 엔진은 42를 객체래퍼로 박싱한다.

         3. 숫자 형태의 문자열 파싱 : 문자열로붙터 숫자 값의 파싱은 비 숫자형 문자를 허용한다. 강제변환 비 숫자형 문자를 허용하지 않기 때문에 비숫자형 문자를 만나면 NaN 이 나온다.  

    반면, parseInt는 문자열에 쓰는 함수이다. 

     

    암시적 강제변환

    암시적 연산을 일으키는 연산의 예시는 아래와 같다.

     

     

     

     


     

    동등 비교 (Loose Equals vs Strict Equals) 

    느슨한 동등 비교 == 

    엄격한 동등비교 === 

    == 비교는 강제변환을 허용하고 ===는 강제변환을 허용하지 않는다.

     

    null == undefined ? 

    1. x == y 

    null과 undefined는 느슨한 비교 시 서로에게 타입을 맞추는 형태로 암시적인 강제변환이 일어난다. 

    (ES5 11.9.3에서 해당 내용을 확인할 수 있다.)

     

    출처 : 262.ecma-international.org/5.1/#sec-9.3, you don't know js 

Designed by Tistory.