기존에 알고 있던 두 자바스크립트 메소드에 보다 본질적으로 접근해보자.
하지만, 이후 연속 물결 연산자(~~)
이건 내가 지은 이름이다.를 알게 된 이후, 주로 숫자형과 숫자형을 나눌 때는 아래와 같이 코드를 쳤다.
~~(NUMBER / NUMBER) // 몫만 확보 가능
참고로, 물결이 하나만 있는 연산자는 Tilt라고 하며, 이는 C 언어에서 파생된 문법으로 비트로 부정하는 연산자이고, ~n === -(n+1)
의 값을 도출할 수 있고, 그 과정에서 소숫점은 벼려진다.
이를 활용해 참, 거짓을 처리할 수 있고, 문자열이나 배열에 아래와 같이 사용되어 특정 값의 유무를 알아낼 수 있다.
// 이터러블 객체를 대상으로, 몇 번째 특정 값이 존재하는지 계산해주는 함수인 indexOf()를 활용하자!
var education = [ '위코드', '스타터스', '유데미' ];
var favorite = '코드';
if (~education.indexOf(favorite)) { // 인수 값이 있다면
console.log("합격 목걸이"); // 이 코드를 실행하라.
} else console.log("우리와 못 가게 되었습니다.");
이러한 원리로 물결을 두 번 사용하면,
~~n === ~(-(n+1)) === -(-(n+1)+1) === n + 1 - 1;
결과적으로 소숫점은 사라지고 원래 몫만 남는, 그런 원리이다!
Mozilla에선 이렇게 정의한다.
문자열 인자를 파싱해 특정 진수(수의 진법 체계에서 기준이 되는 값)의 정수를 반환합니다.
그래서 문자형 인자를 첫 번째 매개변수로 받고, 설령 문자열이 아니더라도 문자열로 강제 변환
하여 문자열로 파싱해 소수점을 없앤다.
여기서 몰랐던 건 parseInt 메소드는 인자를 원래 두 개를 받는다는 것이다!
모질라에선 두 번째 인자를 radix
로 표현하며 다음과 같이 정의하고 있다.
첫 번째 인자의 진수를 나타내는 2부터 36까지의 정수입니다. Number 자료형이 아닌 경우 Number로 변환합니다. 대신 진수값이 2부터 36을 벗어날 경우, NaN을 반환한다.
두 번째 인자의 역할은 첫 번째 인자를 숫자형으로 파싱한 값을 자신이 할당받은 숫자로 된 진수로 읽은 뒤, 10진수의 정수나 NaN으로 반환하는 것이다.
만약 radix가 10을 초과하는 경우 영문 알파벳으로 대체하는데, 예를 들어 16진수에서는 A부터 F까지를 사용한다. 그리고, 첫 번째 인자에서 숫자가 아닌 문자가 있는 경우 해당 문자 이전까지만 파싱하며 문제의 문자 이후는 모두 무시한다.
그러면서, 주의하세요. 기본 값이 10이 아닙니다!라고 강조했다.
그에 대한 예시로, 6.022e23(6.022 × 10^23)처럼 e 문자를 사용해 숫자형을 나타내는데, 매우 크거나 작은 숫자의 소수점 이하 값을 자르기 위해 사용하면 예기치 못한 결과가 발생한다고 한다. 그래서 Math.floor()
과 완전히 같은 맥락의 메소드로 착각하면 안된다고 주의했다.
우선적으로 알아둬야 할 건, 원래
toString
이라는 메소드는Object
객체를 포함해 여러 프로토타입에 상속되지만, 여기서 다룰 메소드는Number
객체에 상속받는 메소드이다!Object
객체를 상속 받는 동명의 메소드를 오버라이딩하는 것이다.
Mozilla에 의하면, 이 메소드 역시 2와 36사이에 radix를 인자로 받는다.
이 메소드가 하는 역할은 parseInt의 그것과 거의 정반대이다.
이 메소드는 숫자형 데이터에 프로퍼티로 존재하며 매개변수 radix가 받은 인자값에 해당 하는 진수로 부모 객체의 구현 값을 변형시켜 준다.
메소드와 함수의 차이점이 뭐에요?