이 글에서는 브라우저 / 엔진 또는 SSJS (Server Side JavaScript) 인터프리터에 관계없이 모든 JavaScript 개발자가 알아야 할 JavaScript 팁, 트릭 및 모범 사례를 제공합니다.
이 글의 코드 스니펫은 V8 JavaScript 엔진 (V8 3.20.17.15)을 사용하는 최신 Chrome 버전 30에서 테스트되었습니다.
1. 변수를 처음으로 선언 할 때마다 var를 붙인다
선언되지 않은 변수는 자동으로 전역 변수로 정의된다. 전역변수를 피하자!
2. == 대신에 === 사용
== 및 != 연산자는 필요한 경우 자동 유형 변환을 수행한다
=== 및 !== 연산자는 변환을 수행하지 않고, 값과 유형을 비교한다. (그래서 ==보다 빠르다, == 및 != 연산자는 되도록 사용하지 않도록하자! )
1 2 3 4 5 6 7 8
[10] === 10// is false [10] == 10// is true '10' == 10// is true '10' === 10// is false [] == 0// is true [] === 0// is false '' == false// is true but true == "a" is false '' === false// is false
3. undefined, null, 0, false, NaN, ''(empty string) 는 논리 값에 False
4. 세미콜론을 사용하여 행 구분
세미콜론을 사용하여 라인종료하는 것이 좋다. 대부분의 경우 JavaScript 파서에 의해 삽입되기 때문에 잊어 버리면 경고하지 않는다. 세미콜론을 왜 사용해야하는지에 대한 자세한 내용은… 참조
var myArray = [12, 222, 1000, 124, 98, 10]; myArray.length = 4; // myArray will be equal to [12 , 222 , 1000 , 124].
또한 배열의 length보다 큰 값을 넣으면 배열의 길이가 변경되고, 새로운 item이 undefined 값으로 추가 된다. 배열 길이는 읽기 전용 속성이 아니다.
1 2
myArray.length = 10; // the new array length is 10 myArray[myArray.length - 1]; // undefined
22. 조건 판정에 논리적 AND / OR 사용
1 2 3
var foo = 10; foo == 10 && doSomething(); // is the same thing as if (foo == 10) doSomething(); foo == 5 || doSomething(); // is the same thing as if (foo != 5) doSomething();
논리적 OR은 함수 argument에 기본 값을 설정하는데 사용할 수 있다.
1 2 3
functiondoSomething(arg1) { arg1 = arg1 || 10; // arg1 will have 10 as a default value if it’s not already set }
23. Use the map() function method to loop through an array’s items
1 2 3 4
var squares = [1, 2, 3, 4].map(function (val) { return val * val; }); // squares will be equal to [1, 4, 9, 16]
24. 소수점 이하 N자리수 반올림
1 2
var num = 2.443242342; num = num.toFixed(4); // num will be equal to 2.4432
25. 부동 소수점 문제
1 2 3
0.1 + 0.2 === 0.3; // is false 9007199254740992 + 1; // is equal to 9007199254740992 9007199254740992 + 2; // is equal to 9007199254740994
0.1 + 0.2 는 0.30000000000000004과 같다. IEEE 754 표준에 따라 JavaScript의 숫자는 모두 내부적으로 64bit 부동 소수점 형으로 다루어지는 것을 알 필요가 있다. 자세한 설명은 블로그 게시물 참조
toFixed()및 버튼 toPrecision()을 사용하면이 문제를 해결할 수 있습니다.
26. for-in 루프를 사용할 때 객체의 속성확인
이 코드 조각은 객체의 프로토타입의 속성을 열거하고 싶지 않은 경우에 편리하다.
1 2 3 4 5
for (var name in object) { if (object.hasOwnProperty(name)) { // do something with name } }
27. 쉼표 연산자
1 2 3 4
var a = 0 ; var b = (a + , 99 ); console . log (a); // a will be equal to 1 console . log (b); // b is equal to 99
28. 요소의 쿼리와 계산을 필요로 하는 Cache 변수
jQuery 셀렉터의 경우는 DOM 요소를 캐시 할 수 있다.
1 2 3 4
var navright = document.querySelector("#right"); var navleft = document.querySelector("#left"); var navup = document.querySelector("#up"); var navdown = document.querySelector("#down");
var numbersArray = [1, 2, 3, 4, 5]; varfrom = numbersArray.indexOf("foo"); // from is equal to -1 numbersArray.splice(from, 2); // will return [5]
splice에 전달 된 인수가 음수가 아닌지 확인해야 함
31. 직렬화와 역직렬화 (JSON 작업)
1 2 3 4 5
var person = { name: "Saad", age: 26, department: { ID: 15, name: "R&D" } }; var stringFromPerson = JSON.stringify(person); /* stringFromPerson is equal to "{"name":"Saad","age":26,"department":{"ID":15,"name":"R&D"}}" */ var personFromString = JSON.parse(stringFromPerson); /* personFromString is equal to person object */
32. eval(), Function 생성자 사용하지 말기
eval이나 Function 생성자의 사용은 JavaScript 엔진이 실행가능한 소스코드로 변환해야하기 때문에 cost가 높다.
1 2
var func1 = newFunction(functionCode); var func2 = eval(functionCode);
33. with() 사용하지 말기 (The Good Part)
with()를 사용하면 전역 범위에 변수가 삽입된다. 따라서 다른 변수와 이름이 같으면 혼동을 일으켜 값을 덮어 쓸 수 있다.
34. 배열에 for-in 루프 사용하지 말기
1 2 3 4
var sum = 0; for (var i in arrayNumbers) { sum += arrayNumbers[i]; }
위 대신에 다음과 같이 사용
1 2 3 4
var sum = 0; for (var i = 0, len = arrayNumbers.length; i < len; i++) { sum += arrayNumbers[i]; }
또한, i와 len의 인스턴스화는 for 루프의 첫번 째 명령문에 있기 때문에 한번 실행된다. 이렇게 하는 것이 아래처럼 하는 것보다 빠르다
1
for (var i = 0; i < arrayNumbers.length; i++)
그 이유는 arrayNumbers의 length를 루프마다 다시 계산하기 때문이다.
35. setTimeout()와 setInterval()는 문자열이 아닌 함수를 전달
setTimeOut() 또는 setInterval()로 문자열을 전달하면 실행속도가 느린 eval과 같은 방식으로 평가된다.
try-catch-finally 절은 현재 범위에 매번 새로운 변수를 생성한다. 이것은 catch 절에서 포착되는 예외를 할당하기 때문이다.
1 2 3 4 5 6 7 8 9
var object = ["foo", "bar"], i; for (i = 0, len = object.length; i < len; i++) { try { // do something that throws an exception } catch (e) { // handle exception } }
위 대신에 다음과 깉이 사용
1 2 3 4 5 6 7 8 9
var object = ["foo", "bar"], i; try { for (i = 0, len = object.length; i < len; i++) { // do something that throws an exception } } catch (e) { // handle exception }
정리
이 밖에도 팁 및 우용한 모범사례가 많이 있습니다. 만약 다른 것을 추가하는 것을 바라고, 의견이나 지적이 있으면 댓글을주세요.