Javascript Cookbook

문자열이 존재하는지 또는 빈 문자열인지 확인하기

문제

변수가 정의되어 있으며 문자열이 들어 있는지 혹은 비어 있는지 확인하고 싶다

해결

typeof 연산자, valueOf 메서드, String 객체의 length 속성을 사용하면 변수가 정의되어 있으며 문자열이 들어 있는 지 혹은 비어 있는지 확인하는 조건문을 작성할 수 있다.

//변수가 존재하고 문자열이며 0보다 큰 길이를 가지고 있으면 참
if (((typeof someVariable != "undefined") && (typeof someVariable.valueOf() == "string")) && (someVariable.length > 0)) {
...
}

설명

length를 사용하면 문자열의 길이를 알 수 있고, 문자열 변수가 빈 문자열인지 아닌지 확인할 수 있다.(빈 문자열이면 length가 0)

if(strFromFormElement.length == 0)  //빈 문자열인지 테스트

변수가 정의되어 있지 않다면 undefined 자바스크립트 오류가 발생한다. 변수의 존재 여부는 typeof 연산자를 사용하여 확인할 수 있다. typeof 연산자는 변수의 타입을 반환한다.

typeof 연산자는 변수의 타입을 반환한다. 반환되는 값은 다음과 같다.

  • number - 변수가 숫자일 때
  • string - 변수가 문자열일 때
  • boolean - 변수가 불리언값일 때
  • function - 변수가 함수일 때
  • object- 변수가 null, 배열, 또는 자바스크립트 객체일 때
  • undefined - 변수가 정의되지 않았을 때

변수가 정의되어 있고 변수에 담긴 문자열의 길이가 0 이상이면 참이다.

//변수가 존재하고 길이가 0 이상이면 성공
if ((typeof unknownVariable !== "undefined") && (unknownVariable.length > 0)){
    ...
}

위의 코드에 있는 조건문이 정상적으로 작동하지만 정의된 변수가 문자열이 아니고 숫자라면, 숫자에는 length 속성이 정의되지 않았기 때문에 조건은 실패하게 된다.

변수의 타입을 정확하게 알수 없다면 문자열 길이를 테스트하기에 앞서 명시적으로 변수의 데이터 타입이 string인지 테스트해야 한다.

//문자열의 길이가 0보다 크면 참
if ((typeof someVariable == "string") && (someVariable.length > 0)) {
    ...
}

하지만 변수가 문자열 리터럴이 아닌 String 객체라면 typeof 연산자는 string 대신 object를 반환할 것이다. 이것이 바로 또 다른 자바스크립트 객체 메서드인 valueOf를 같이 사용해야 하는 이유이다.

valueOf 메서드는 모든 자바스크립트 객체에서 사용 가능하며, 객체가 무엇이든 원시 자료형을 반환한다. Number, String, Boolean에 대해서는 각각의 원시 자료형을 반환하고 Function에 대해서는 함수의 내용을 반환한다. 그래서 만약 변수가 String 객체라면 valueOf 메서드는 문자열 리터럴을 반환한다.

결국 해결처럼 변수가 정의되었는지 확인하고, 정의되었다면 valueOf 메서드를 사용해서 String 객체 혹은 문자열 리터럴인지 확인한 후 문자열의 길이가 0보다 큰지 확인하는 코드는 아래와 같다.

//변수가 존재하고 문자열이며 0보다 큰 길이를 가지고 있으면 참
if (((typeof someVariable != "undefined") && (typeof someVariable.valueOf() == "string")) && (someVariable.length > 0)) {
...
}