변수가 정의되어 있으며 문자열이 들어 있는지 혹은 비어 있는지 확인하고 싶다
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)) {
...
}