본문 바로가기
개발/웹

자바스크립트에서 발생할 수 있는 실수들: 주의할 점과 예방법

by 미아보호자 2024. 11. 1.

 

실수를 방지하자!

 

자바스크립트는 웹 개발에서 필수적인 언어이지만, 상대적으로 유연한 구조 때문에 초보자부터 전문가까지 다양한 실수를 발생시킬 수 있습니다. 특히 디버깅을 어렵게 하고, 예기치 않은 문제를 일으킬 수 있어 주의가 필요합니다. 이번 글에서는 자바스크립트에서 빈번하게 발생하는 실수와 이를 예방하기 위한 방법을 알아보겠습니다.

 

1. ==과 ===의 혼동

자바스크립트는 두 개의 동등 비교 연산자인 ==과 ===을 지원합니다.

==은 타입 변환을 허용하여 비교하지만, ===은 타입을 엄격하게 비교합니다.

예를 들어, 0 == '0'은 true를 반환하지만, 0 === '0'은 false를 반환합니다.

타입 변환이 필요한 경우를 제외하고는 항상 ===을 사용하는 것이 좋습니다.

// 예기치 않은 결과 발생
if (0 == '0') {
  console.log("같다!"); // 실행됨
}

// 올바른 방식
if (0 === '0') {
  console.log("같다!"); // 실행되지 않음
}

 

 

2. var, let, const의 오용

자바스크립트에서는 변수를 선언할 때 var, let, const 키워드를 사용할 수 있습니다.

var은 전역 범위에서 변수를 선언하므로 의도치 않은 덮어쓰기 오류가 발생할 수 있습니다.

함수나 블록 내에서 변수를 선언할 때는 let이나 const를 사용하는 것이 좋습니다.

  • let: 값이 변경될 수 있는 변수 선언 시 사용
  • const: 값이 고정된 상수 선언 시 사용
var x = 10;
if (true) {
  var x = 20;
  console.log(x); // 20
}
console.log(x); // 20 - var로 선언해 범위가 예상과 달리 전역으로 처리됨

let y = 10;
if (true) {
  let y = 20;
  console.log(y); // 20
}
console.log(y); // 10 - let으로 선언해 예상한 대로 블록 스코프가 적용됨

 

 

3. null과 undefined의 혼동

null과 undefined는 모두 ‘존재하지 않음’을 나타내지만, 의미가 다릅니다.

null은 개발자가 값이 없음을 명시적으로 지정한 상태를 의미하고, undefined는 변수가 선언되었으나 값이 할당되지 않은 상태입니다.

잘못된 값을 체크하는 조건문에서 혼동을 피하려면 명확히 구분해야 합니다.

let a;
let b = null;

console.log(a); // undefined
console.log(b); // null

if (a === undefined) {
  console.log("a는 값이 정의되지 않았습니다.");
}

if (b === null) {
  console.log("b는 null입니다.");
}

 

 

4. 함수에서 this 키워드의 오용

자바스크립트의 this 키워드는 함수가 호출된 방식에 따라 다른 객체를 가리킵니다.

화살표 함수(=>)는 부모 스코프의 this를 유지하지만, 일반 함수는 호출 시점의 this를 사용합니다.

실수를 방지하려면 의도한 this가 맞는지 확인하거나, 화살표 함수를 적절히 사용하는 것이 좋습니다.

const obj = {
  value: 10,
  showValue: function () {
    console.log(this.value); // 10
  },
  showValueArrow: () => {
    console.log(this.value); // undefined - 화살표 함수는 부모 스코프의 this를 사용함
  }
};

obj.showValue(); // 10
obj.showValueArrow(); // undefined

 

 

5. 호이스팅(Hoisting)으로 인한 예기치 않은 결과

자바스크립트에서는 변수와 함수 선언이 코드 상단으로 끌어올려지는 ‘호이스팅’이 발생합니다. 이는 선언된 변수를 초기화하기 전에도 사용할 수 있는 것처럼 보이게 만들지만, 예기치 않은 오류를 초래할 수 있습니다.

console.log(x); // undefined
var x = 5;

console.log(y); // ReferenceError
let y = 5;

 

 

6. 비동기 처리에서의 콜백 헬과 프로미스 체이닝 오류

자바스크립트는 비동기 처리를 위한 다양한 방법을 제공합니다. 그러나 콜백 함수를 중첩하여 사용하는 ‘콜백 헬’은 코드 가독성을 떨어뜨리고 디버깅을 어렵게 만듭니다. 이를 해결하기 위해 async와 await를 활용하여 비동기 코드를 직관적으로 작성하는 것이 좋습니다.

// 콜백 헬
getUserData(function(user) {
  getPosts(user, function(posts) {
    getComments(posts[0], function(comments) {
      console.log(comments);
    });
  });
});

// async/await 사용
async function fetchComments() {
  const user = await getUserData();
  const posts = await getPosts(user);
  const comments = await getComments(posts[0]);
  console.log(comments);
}

 

 

7. 전역 변수 사용의 남용

전역 변수는 모든 스코프에서 접근할 수 있어 실수를 유발하기 쉽습니다. 변수 충돌이나 의도치 않은 덮어쓰기를 방지하려면 가능한 한 전역 변수 사용을 지양하고, 필요한 경우에는 const로 상수처럼 사용합니다.

 

 

결론

자바스크립트는 유연성이 높은 언어지만, 방심하면 예기치 않은 오류가 발생할 수 있습니다. 위에서 언급한 실수들을 주의하고 적절한 코딩 습관을 갖추면, 보다 안전하고 효율적인 자바스크립트 개발이 가능합니다.