[Effective Javascript #1]

Nowod_K·2022년 7월 13일
0
post-thumbnail

Effective Javascript를 읽고 정리해보는 글입니다.
출처: Effective Javascript

자바스크립트의 부동소수점

대부분의 프로그래밍 언어는 여러 종류의 숫자형 데이터를 가지지만, 자바스크립트에는 하나밖에 없다. 그리고 자바스크립트의 숫자는 double 정확도의 부동 소수점 숫자다!

부동소수점의 산술 연산 정확도에는 한계가 있기에, 자바스크립트에서 실수형을 처리할 때는 주의가 필요하다.

아래 2개의 연산은 결과값이 같아야 하지만 부동소수점 처리로 인해 결과값이 달라진다.

(0.1 + 0.2) + 0.3; // 0.600000000000001
0.1 + (0.2 + 0.3); // 0.6

그렇기에 자바스크립트에서 숫자를 처리할 때는 좀 더 주의를 기울여야 한다.

  1. 첫번째 대안은 정수 값을 사용하는 것이다.
    a. 예를 들어 달러를 계산할 때 1.3달러가 아닌 1달러 3센트로 뒤의 소수점을 따로 계산하는 것이다.
  2. 실수형을 더하거나 계산을 하는 경우 자리수를 명확하게 하여 계산하는 것이다.
  3. 부동소수점 산술 연산의 정확도에 한계가 있음을 항상 주의해야한다.

암묵적인 형변환 주의

자바스크립트는 데이터형 오류에 놀라울 정도로 관대하다.

예를 들어 3 + true; 의 경우 다른 언어에서는 에러가 나겠지만, 자바스크립트에서는 4라는 결과가 나온다.

문자와 숫자를 더하는 경우에도 이와 같이 형변환이 일어난다.

"2" + 3; // 23
2 + "3"; // 23

이러한 형변환은 얼핏보면 굉장히 편하다. 하지만 편한만큼 오류를 숨기거나, 큰 오류를 발생시킬 수도 있다.

단순 숫자와 문자 뿐만 아니라, 객체와 bool에도 암묵적 형변환이 들어간다.
특히 객체의 경우 valueOf를 통해 숫자로, toString을 통해 문자로 형변환 된다.

트루시니스(truthiness)도 항상 주의해야한다. 투루시니스란 실제로 true, false가 아니지만 강제 형변환에 의해 true나 false처럼 처리되는 값이다.

false로 처리되는 값은 0, -0, "", NaN, null, undefined 이다. 다른 모든 값은 true로 처리된다. 따라서 undefined와 같은 값을 테스트할 때는 typeof를 사용하거나, undefined와 비교하는 것이 좋다.

또한 비교할 때 == 연산자보다 === 연산자를 사용하면 암묵적 형변환을 피할 수 있다. === 연산자는 값을 명확하게 비교할 수 있고, 코드의 의미를 명확하게 전달할 수 있기에 사용을 권장한다.

profile
개발을 좋아하는 마음과 다양한 경험을 토대로 좋은 개발자가 되고자 노력합니다.

0개의 댓글