본문 바로가기

프로그래밍(TA, AA)/자바스크립트

[자바스크립트] 자바스크립트를 잘 사용하기 위한 67가지 규칙

다른 많은 언어들은 변하지 않도록 제한하는 것들이 있습니다. 예를 들어 빌트인 객체가 런타임에 수정되거나 확장되지 않고, 표준 라이브러리 이름의 바인딩이 할당에 의해 덮어 쓰일 수 없습니다. 이와 달리 자바스크립트는 모든 객체들의 수정을 거의 전적으로 허용합니다. 이런 설계가 특정 도메인(예를 들어, 신뢰할 만하거나 그렇지 않은 코드가 브라우저의 보안 경계 내에서 안전하게 섞인 경우)에서는 분명히 도전과제를 안겨줄 것입니다. 


자바스크립트의 유연성은 혁신적인 사용자들을 자극해서 더 창조적인 방향으로 구성되고 성장할 수 있습니다. 선구자들은 다른 언어를 본떠 도구들과 프레임워크 라이브러리들을 만들었습니다. 루비를 본뜬 Prototype, 파이썬을 본뜬 MochiKit, 자바를 본뜬 Dojo, 스몰토크를 본뜬 TIBET 등이 있습니다. 


자바스크립트는 하위 호환성(버그 호환성)을 유지하며 기본적으로 수정 가능합니다. 하지만 최신 버전의 ECMAScript 표준은 추가적인 특정 메서드를 제공하기도 합니다. 확장을 막기 위해 객체를 고정시키거나 객체의 프로퍼티가 덮어써지지 않도록 막을 수도 있습니다. 


어떤 언어도 행동의 기이한 특징에서 자유로울 수 없고, 전체적인 최선의 실천 방법을 기술할 수 있을 정도로 제한적일 수도 없습니다. 또한 자바스크립트는 행동의 기이한 특징이 없는 언어나 제한주의자의 생각과는 거리가 멉니다. 따라서 효과적인 개발을 위해, 대부분의 다른 프로그래밍 언어들과 마찬가지로 자바스크립트 개발자는 반드시 훌륭한 스타일과 적절한 사용법을 공부하고, 최선의 실천방법을 추구해야 합니다. 무엇이 가장 효과적인지 고려할 때 중요한 것은, 경직되고 독단적이며 과도하게 제한하는 스타일 가이드를 제시하지 않는 것입니다. -브랜든 아이크(Brendan Eich)



자바스크립트는 개발자가 친근하게 느끼도록 설계되었습니다. 자바의 문법을 생각나게 하고, 함수, 배열, 딕셔너리 그리고 정규식처럼 다른 스크립트 언어들과도 공통점이 많습니다. 자바스크립트는 약간의 프로그래밍 경험만 있다면 어느 누구도 빠르게 습득할 수 있습니다. 또한 언어의 핵심 개념이 그리 많지 않기 때문에 초보 프로그래머도 비교적 적은 훈련만으로 프로그램 작성을 시작할 수 있습니다.


또한 웹을 논하지 않고 자바스크립트에 대해서 이야기하기는 매우 어렵습니다. 현재까지 자바스크립트는 클라이언트 측 애플리케이션 스크립팅을 위해 모든 주요 웹브라우저에서 빌트인으로 지원하는 유일한 프로그래밍 언어입니다.


자바스크립트가 다가가기는 쉽지만, 마스터하기까지는 많은 시간이 필요하며, 코드의 의미와 특징, 그리고 가장 효과적인 코딩 관례에 대한 더 깊은 이해가 필요합니다. 



프로그래밍 언어를 배우기 위해서는 그 언어의 문법 즉, 제대로 된 프로그램을 만들기 위한 형식과 구조들뿐만 아니라, 그 형식의 뜻이나 특성을 뜻하는 시맨틱을 알아야 합니다. 또한 언어를 마스터하려면 효과적인 프로그램을 만드는 데 사용하는 언어의 기능을 이해해야 합니다. 유연하고 표현력이 좋은 자바스크립트와 같은 언어의 경우 이런 실제적인 활용방법은 파악하기가 특히 어려울 수 있습니다.



자바스크립트와 ECMAScript

언어를 설명하는 명세를 정의한 공식적인 표준은 ECMAScript라고 부릅니다. 역사는 복잡하지만 저작권의 문제로 축약할 수 있습니다. 법적인 이유로, 표준기관인 Ecma International은 'JavaScript'라는 이름을 표준으로 사용할 수가 없습니다. 


공식적으로, 사람들이 ECMAScript를 언급할 때 그들은 일반적으로 Ecma 표준을 구체화한 '이상적인' 언어를 가리킵니다. 반면에, JavaScript라는 이름은 현존하는 실제 활용되고 있는 어떤 언어나 특정 회사의 구체적인 자바스크립트 엔진을 지칭할 수도 있습니다. 보통 사람들은 이 두 가지 용어를 서로 구분 없이 사용합니다.



자바스크립트와 동시성

자바스크립트의 이상한 면 중 하나는 동시적인 설정에 대한 동작이 완전히 기술되지 않았다는 점입니다. ECMAScript 표준은 자바스크립트 프로그램의 상호대화적이거나 동시적인 환경에 대해서 전혀 언급하고 있지 않습니다. 실제 비공식적인 자바스크립트 기능으로 동시성이 있습니다. 실제로는 모든 주요 자바스크립트 엔진이 똑같은 동시성 모델을 공유합니다. 비록 동시성과 상호대화적인 프로그램에 대한 표준화는 아직 존재하지 않지만 이들은 자바스크립트 프로그래밍의 핵심적인 통합 개념입니다.




자바스크립트에 익숙해지기

아이템1 어떤 자바스크립트를 사용하고 있는지 알아야 한다

아이템2 자바스크립트의 부동 소수점 숫자 이해하기

아이템3 암묵적인 형변환을 주의하라

아이템4 객체 레퍼보다 원시 데이터형을 우선시하라

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

아이템6 세미콜론 삽입의 한계에 대해서 알아두자

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


변수 스코프

아이템8 전역 객체의 사용을 최소화하라

아이템9 항상 지역 변수를 선언하라

아이템10 with를 사용하지 마라

아이템11 클로저에 익숙해져라

아이템12 변수 호이스팅에 대해 이해하라

아이템13 지역변수 스코프를 만들기 위해 즉시 실행 함수 표현식을 사용하라

아이템14 기명함수 표현식의 스코프에 주의하라

아이템15 블록-지역 함수 선언문의 스코프에 주의하라

아이템16 eval을 이용해 지역 변수를 생성하지 마라

아이템17 직접적인 eval보다 간접적인 eval을 사용하라


함수 사용하기

아이템18 함수, 메서드, 생성자 호출의 차이를 이해하라

아이템19 고차 함수에 익숙해져라

아이템20 지정된 수신자 객체로 함수를 호출하기 위해 call 메서드를 사용하라

아이템21 다른 개수의 인자로 함수를 호출하기 위해 apply를 사용하라

아이템22 가변 인자 함수를 생성하기 위해 arguments를 사용하라

아이템23 절대 arguments 객체를 수정하지 마라

아이템24 자바스크립트의 부동 소수점 숫자 이해하기

아이템25 고정된 수신자 객체로 메서드를 추출하기 위해 bind를 사용하라

아이템26 커링 함수에 bind를 사용하라

아이템27 코드를 캡슐화하기 위해 문자열보다 클로저를 사용하라

아이템28 함수의 toString 메서드에 의존하지 마라

아이템29 비표준 스택 검사 프로퍼티를 사용하지 마라


객체의 프로토타입

아이템30 __proto__보다 Object.getPrototypeOf를 사용하라

아이템31 __proto__를 절대 수정하지 마라

아이템32 생성자가 new와 관계없이 동작하게 만들어라

아이템33 메서드를 프로토타입에 저장하라

아이템34 비공개 데이터를 저장하기 위해 클로저를 사용하라

아이템35 인스턴스의 상태는 인스턴스 객체에만 저장하라

아이템36 this의 명시적인 바인딩에 대해 이해하라

아이템37 하위 클래스 생성자에서 상ㅇ위 클래스 생성자를 호출하라

아이템38 상위 클래스 프로퍼티 이름을 절대 재사용하지 마라

아이템39 표준 클래스를 상속하지 마라

아이템40 프로토타입을 세부 구현 사항처럼 처리하라

아이템41 무모한 몽키 패칭을 하지 마라


배열과 딕셔너리

아이템42 직접적인 객체의 인스턴스로 가벼운 딕셔너리를 만들어라

아이템43 프로토타입 오염을 막기 위해 null 프로토타입을 사용하라

아이템44 프로토타입 오염을 막기 위해 asOwnProperty를 사용하라

아이템45 순서가 정해진 컬렉션에는 딕셔너리 대신 배열을 사용하라

아이템46 Object.prototype에 열거 가능한 프로퍼티를 절대 추가하지 마라

아이템47 열거하는 동안 객체를 수정하지 마라

아이템48 배열을 반복할 때 for...in 대신 for 반복문을 사용하라

아이템49 반복문 대신 반복 메서드를 사용하라

아이템50 유사 배열 객체에 범용적인 배열 메서드를 재사용하라

아이템51 Array 생성자 대신 배열 리터럴을 사용하라


라이브러리와 API 설계

아이템52 일관된 컨벤션을 유지하라

아이템53 undefined를 '값이 없는' 것처럼 처리하라

아이템54 키워드 인자를 위해 옵션 객체를 받아들여라

아이템55 불필요한 상태 유지를 피하라

아이템56 유연한 인터페이스를 위해 구조화된 형식을 사용하라

아이템57 배열과 유사 배열 객체를 구별하라

아이템58 과도한 강제 형변환을 피하라

아이템59 메서드 체이닝을 지원하라


동시성

아이템60 이벤트 큐를 I/O에 블로킹시키지 마라

아이템61 비동기 시퀀스를 위해 감싸지거나 이름이 지정된 콜백을 사용하라

아이템62 오류를 놓치지 않도록 조심하라

아이템63 비동기적인 반복문을 위해 재귀를 사용하라

아이템64 계산 중 이벤트 큐를 블로킹하지 마라

아이템65 동시성 연산을 수행하기 위해 카운터를 사용하라

아이템66 비동기 콜백을 절대 동기적으로 호출하지 마라

아이템67 더 깔끔한 비동기 로직을 위해 promise를 사용하라