[javascript] 문자열 "true"/"false" 와 불리언을 비교하기

문자열로 표현한 불리언 값인 "true"는 실제 자바스크립트의 불리언인 true와는 다릅니다.

자바스크립트의 비교연산자로 비교한 "true" == true, "true" === true 는 false가 됩니다.

따라서 문자열을 불리언으로 변경하거나, 불리언을 문자열로 변경해서 비교를 해야합니다.

특히 비동기로 결과를 받아서 그 값이 참인지 거짓인지를 판단해야 할 때 반환된 결과가 문자열이기 때문에 변환하는 과정을 꼭 거쳐야 합니다.

여러 종류의 값이 가능한 문자열 보다는 true/false 2가지만 있는 불리언이 비교가 쉽고 명확하기 때문에 문자열을 불리언 타입으로 변환해서 비교를 하는 방법을 사용하는 것이 일반적입니다.

가장 기초적인 "True", "true", " true " 와 같은 불리언 문자열 표현을 불리언으로 변환하는 문자열 객체의 메서드를 다음과 같이 만들 수 있습니다.

String.prototype.toBoolean = function(){
    if (this.toLowerCase().trim() === "true"){
        return true;
    }else{
        return false;
    }
}    
console.log("True ".toBoolean());

아주 심플하고 단순하게 문자열을 불리언으로 변환하려면 문자열을 JSON 객체로 변환해주는 JSON 객체의 메서드인 parse() 를 사용하는 방법도 있습니다.

var str = "true";
console.log(JSON.parse(str));

단, 이 메서드는 소문자 "true", "false" 에만 대응(앞뒤 공백 가능)하기 때문에 대문자가 포함된 "True"/"False" 와 같은 문자열은 불리언으로 변환하지 못하고 에러를 발생시킵니다.

불리언으로 참이되는 조건이 "true"와 같은 불리언 문자열 뿐만 아니라 "1"이나 "on", "yes"와 같은 다양한 값에 대한 불리언 변환을 하고 싶으면 다음과 같이 메서드를 만들 수 있습니다.

String.prototype.toBoolean = function(){
    if ( ["yes", "true", "1", "on", "y"].indexOf( this.toLowerCase().trim() ) !== -1 ) return true;
    if ( ["no", "false", "0", "off", "n"].indexOf( this.toLowerCase().trim() ) !== -1 ) return false;
    return Boolean(this);
}
console.log(" yes ".toBoolean());

이 메서드는 불리언으로 변환하는 대상이 문자열인 경우에만 적용할 수 있기 때문에 문자열이 아닌 다양한 경우에는 대응할 수 없습니다. undefined 나 숫자형 등 더 다양한 경우에 대한 변환을 하려면  다음과 같이 함수형으로 구현해야 합니다.

function parseBoolean(str) 
{
    if(str == null || str == undefined) return false; // null, undefined
    if(!isNaN(str)) return (parseFloat(str) != 0); // 숫자

    if (typeof str === 'boolean') return (str === true);//불리언
    if(typeof str === 'string')//문자열
    {
        if(str == "") return false;
        if ( ["yes", "true", "1", "on", "y"].indexOf( str.toLowerCase().trim() ) !== -1 ) return true;
        if ( ["no", "false", "0", "off", "n"].indexOf( str.toLowerCase().trim() ) !== -1 ) return false;
        return Boolean(this);
    }
}
console.log(parseBoolean(undefined));