Front-end/Javascript

[강제변환]

madison 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