[Effective JavaScript] CHAP 1. JS 에 익숙해지기

진도리·2022년 12월 31일

스터디

목록 보기
2/2

Chapter 1. JS에 익숙해지기

어떤 JS를 사용하고 있는지 알아야 한다.

  • 웹 프로그램은 모든 부라우저에서 지속적으로 동작할 수 있도록 주의해서 작성하자

    • why?
      • 웹 브라우저마다 JS 버전이 다르고, 버전이 다르면 동작방식에 차이가 있음.
  • JS의 새로운 표준 또는 비표준 기능을 사용할 경우, 먼저 이런 기능을 지원하는 환경인지를 파악 후에 사용

    • why?
      • JS는 웹 뿐만 아니라 서버, 모바일 등 다양한 환경의 App을 만들 때에도 사용된다.
      • 이 경우엔 JS버전이 구체화 되기에 지원되는 기능인지 확인 후 사용해야 한다.
  • "use strict" 사용

    • why?
      • "use strict"는 다양한 버전의 오류를 일으키기 쉽거나 문제를 일으킬 만한 기능들을 사용할 수 없게 한다.

부동 소수점 숫자 이해하기

  • int, float, long, double 같이 잘 알려져있는 타입들은 JS 에선 모두 number type
    • JS의 number 타입은 IEEE 754 표준에서 정의한 64bit 배정밀도로 인코딩된 double 타입
  • JS에서 64bit 부동 소수점 연산의 특징
    • 비트 단위 연산 수행 과정
      • (1). 비트 단위 연산 시, 64bit가 아닌 32bit 정수로 치환
      • (2). 연산수행
      • (3). 결과를 다시 부동소수점으로 치환 후 반환
      • (4). 반환된 값을 저장
    • 최적화 컴파일러가 데이터를 내부적으로 정수형으로 저장하여 부가적인 연산을 회피
      • when ?
        • 연산표현식이나 변수가 명시적으로 정수형으로 동작할 경우
    • 64bit 부동 소수점 연산은 산술연산에서 문제를 일으키기도 함
      • why ?
        • 부동 소수점 산술 연산은 근사 값만 만들어 낼 수 있다.
      • 근사 값은 표현 가능한 가장 가까운 실수로 반올림해서 생성
      • 이런 근사 값들끼리의 계산이 누적되면 부정확한 결과를 초래함
      • 따라서 웬만하면 소수를 정수형태로 바꿔서 계산 (정수는 반올림해서 근사 값을 만들 필요가 없으니)
        • 예를 들어, n 달러는 n*10 센트로 치환해서 계산 (돈 관련된 계산은 문제가 생기면 치명적이게 된다...)

암묵적인 형변환을 주의하라

  • JS 는 데이터 형 오류에 관대하다.
    • 관대하다 ? : 다른 프로그래밍언어에서 오류를 발생시킬 법한 코드를 JS에선 암묵적으로 형변환함.
  • Truthy & Falsy
    • Truthy : true 로 처리되는 값
      • JS에선 Falsy 값 7개를 제외하고 모든 값은 Truthy
    • Falsy : false 로 처리되는 값
      • false, 0, -0, NaN, null, undefined, ""
      • JS 구현체에 따라 Falsy 값들이 서로 다른 경우가 종종 있다고 하니 Falsy 에 의지하지는 말자.

"암묵적인 형변환은 프로그램의 규모가 커질 수록 예측하기 어려운 값들을 만들어 냄"

객체 래펖보다 원시 데이터형을 우선시하라

  • 원시 데이터형과 원시 데이터형을 위한 객체 래퍼는 서로 다르며 동작이 다름
    • 원시 데이터형 문자열과 다르게, String 객체는 진짜 객체임
  • String 객체는 개별 객체
    • String 객체는 개별 객체이기에 자기자신과만 동일
  • 암묵적인 감싸기
    • 원시 데이터형을 객체 래퍼로 암묵적 강제 형변환 하여 메서드드를 사용할 수 있도록 함
  • 암묵적인 감싸기는 실행될 때 마다 새로운 객체를 생성

"암묵적인 강제 형변환에 속아 추적이 어려운 오류를 발생시키지 말자"

혼합된 데이터형을 == 로 비교하지 마라

  • 보기에 연관이 없는 두 값을 암묵적 강제 형변환에 의지하여 == 로 비교하지 말자
    • Why ? : 코드를 읽는 사람이 형변환 법칙을 기억하려고 애쓸 필요없이 어떤 변환이 적용되는지 정확하게 알 수 있도록 하는 것이 더 깔끔하고 좋은 코드임

"코드를 읽는 사람이 더 예측하기 쉬운 코드를 작성하자"

세미콜론(;) 삽입의 한계에 대해 알아두자

  • 세미콜론은 한 줄 이상의 새로운 행이나, 프로그램 입력의 마지막이나 '}' 토큰 전에 삽입
    • 세미콜론은 줄의 마지막, 블록의 마지막, 프로그램의 마지막 부분에서 생략해도 됨
  • 세미콜론은 다음 입력 토큰을 파시할 수 없을 때에 삽입됨
    • 세미콜론은 생략한 줄의 다음 줄의 토큰이 생략한 줄의 연장선으로 해석될 수 있으면 이 줄에 세미콜론을 넣지 않음
      • 다음 줄 토큰이 '(', '{', '+', '-', '/' 로 시작할 경우 연장선으로 해석될 경우가 많음
  • 세미콜론은 for 반복문의 머리 부분에서는 세미콜론이 구부나 또는 빈 선언문으로 추론되어 삽입되는 경우는 없음

따라서

  • JS 세미콜론 생략가능 하지만 웬만하면 세미콜론 넣는 것을 습관화하자.
    • Why? : JS 는 자동으로 세미콜론을 삽입하지만, 코드를 어떻게 작성하더라도 JS가 작성자의 의도에 맞게 세미콜론을 삽입해 주는 것을 아니니까
    • 외에도, 코드리뷰시, 세미콜론 누락된 코드를 보면 코드 검토를 하지 않은 것 같은 느낌이 들게함.

문자열을 16비트 코드 단위의 시퀀스로 간주하라

  • 시간이 지남에 따라 유니코드의 범위가 확장되어 16비트 코드 유닛 하나만으로는 표현하기 어려운 문자들이 등장
    • JS는 16비트 문자 인코딩을 사용
    • 이모지 같은 거 문자열에 넣으면 문자열 index 가 예상하기 어려운 경우가 많다.

따라서

  • 두개의 코드 유닛(== 대리쌍)으로 작성되는 문자열을 많이 다루는 프로그래밍을 할 경우 코드 포인트를 인식할 수 있는 라이브러리를 사용하는 것이 좋음.

작성중
마크다운 수정 및 예시 코드 넣어야함

출처 : Effective JavaScript
David Herman 저. 김준기 역.
yes24

profile
매일 작은 보폭이라도 앞으로.

0개의 댓글