JavaScript에서 문자열을 부울로 변환하려면 어떻게해야합니까?


2551

부울 값 (예 : 'true', 'false')을 나타내는 문자열을 JavaScript에서 내장 유형으로 변환 할 수 있습니까?

목록에서 사용자의 선택에 따라 업데이트되는 HTML의 숨겨진 양식이 있습니다. 이 형식에는 부울 값을 나타내는 일부 필드가 포함되며 고유 부울 값으로 동적으로 채워집니다. 그러나이 값이 숨겨진 입력 필드에 배치되면 문자열이됩니다.

필드의 부울 값을 결정하는 유일한 방법은 일단 문자열로 변환되면 문자열 표현의 리터럴 값에 의존하는 것입니다.

var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';

이것을 달성하는 더 좋은 방법이 있습니까?


50
"이를 수행하는 더 좋은 방법이 있습니까?" -더 나쁜 방법이 있습니다 : Dstring=(string==String(string?true:false))?(string?true:false):(!string?true:fa‌​lse);
Mark K Cowan

3
function parseBool(val) { return val === true || val === "true" }
현과 부울을

1
@Markfunction checkBool(x) { if(x) {return true;} else {return false;} }
Sebi

2
@Sebi : 문서화를 잊었습니다 :if (checkBool(x) != false) { ... } else { ... }
Mark K Cowan

3
!!(parseInt(value) || value === "true")
Andrew Luca

답변:


3478

하다:

var isTrueSet = (myValue == 'true');

항등 연산자 ( ===) 대신 비교 변수의 유형이 다른 경우 암시 적 유형 변환을 수행하지 않는 항등 연산자 ( ) 를 사용하여 더 엄격하게 만들 수 있습니다 ==.

var isTrueSet = (myValue === 'true');

하지 마십시오 :

당신은 아마한다 이러한 두 가지 방법 사용에 대한주의 사용자의 특정 요구를 들어 :

var myBool = Boolean("false");  // == true

var myBool = !!"false";  // == true

빈 문자열이 아닌 문자열은이 true를 사용하여 평가됩니다 . 부울 변환과 관련하여 내가 생각할 수있는 가장 깨끗한 방법이지만, 당신이 찾고있는 것이 아니라고 생각합니다.


196
myValue === 'true';와 정확히 동일합니다 myValue == 'true';. 사용에 아무런 이득이 없다 ===이상 ==여기가.
Tim Down

551
나는 따라 크록 포드의 조언 및 사용을 ===하고 !==때마다 거의 항상하는 의미가 있습니다.
기니

55
예를 들어 대문자로 "TRUE"는 어떻습니까?
BMiner

102
@guinaps 나는 보통 Crockford의 조언을 따르지만 ==vs. ===시나리오는 내가하지 않는 몇 가지 중 하나입니다. 나는 "거의 항상"사용하는 것이 합리적이라고 완전히 동의하지 않습니다 ===. 느슨한 타입의 언어 는 타입에 신경 쓰지 않기 때문에 존재 합니다. 우리가 무언가를 확인 if (price >= 50)하면 문자열로 시작했는지 상관하지 않습니다. 나는 말을 대부분 의 시간, 우리가 원하는 종류의 곡예를 할 수 있습니다. 드물게 타입 저글링을 원하지 않는 경우 (예 :) if (price === null)를 사용 ===합니다. 이것은 내가 몇 년 동안 해왔 으며 결코 문제 가 없었 습니다.
JMTyler

169
@JMTyler는 향후 유지 보수 프로그래머를 간과 할 수 있습니다. 항상 적절한 비교 연산자를 사용하십시오! 양쪽에 유형을 '확실히'알고 있지만 ===를 사용하지 않으면 나중에 코드를 볼 때 그 지식을 얻지 못할 것입니다. 코드를 재사용하면 악몽이 될 수 있습니다. 말한대로 유형이 '저글링'되기를 원한다면 '=='를 사용하십시오. 그러나 너무 많은 JS 개발자는 너무 쉽게 트립되어 코드를 강화하는 것이 좋습니다. 부울 'true'를 나타내는 문자열 'false'를 얼마나 자주 원합니까?
aikeru

687

경고

이 고도로 공명 된 레거시 답변은 기술적으로 정확하지만 문자열 값이 EXACTLY "true"또는 인 경우 매우 구체적인 시나리오에만 적용됩니다 "false".

유효하지 않은 json 문자열이 아래 함수에 전달 되면 예외가 발생 합니다.


원래 답변 :

어때요?

JSON.parse("True".toLowerCase());

또는 jQuery와 함께

$.parseJSON("TRUE".toLowerCase());

62
이것의 문제점은 많은 잠재적 값이 구문 분석 오류를 생성하여 JS 실행을 중지한다는 것입니다. 따라서 JSON.parse ( "FALSE")를 실행하면 Javascript에 영향을줍니다. 질문의 요점은 이러한 정확한 사례를 단순히 해결하는 것이 아니라 다른 사례에 대해서도 탄력적이라고 ​​생각합니다.
BishopZ

3
@Luke이 솔루션은 실제로 내가 필요한 것입니다. 글쎄, 그것을 try ... catch에 감싸십시오. 문자열의 부울 값인 경우에만 bool로 변환하고 싶었습니다. 그렇지 않으면 제공된 문자열을 사용하십시오. 작동합니다! 감사.
jedmao

47
JSON.parse("TRUE".toLowerCase())올바르게 구문 분석 할 수 있도록 말하는 것은 매우 간단 합니다.
Yuck

27
왜 그렇게 많은 투표가 있습니까? 이것은 비효율적이고 끔찍합니다. 다음은 무엇입니까? 'true'.length === 4?
Maksim Vi.

21
@MaksimVi. typeof str==="string"&& str.length===4&& str.charAt(0)==="t" && str.charAt(1)==="r" && str.charAt(2)==="u" && str.charAt(3)==="e"&& true===true && true!==false && false===false// 확실히
Vitim.us

223
stringToBoolean: function(string){
    switch(string.toLowerCase().trim()){
        case "true": case "yes": case "1": return true;
        case "false": case "no": case "0": case null: return false;
        default: return Boolean(string);
    }
}

43
실제로는 단순화 될 수 있습니다. 1)이 테스트 할 필요가 없다 "true", "yes"하고 "1". 2) toLowerCase반환하지 않습니다 null. 3) 여기 Boolean(string)string!==""같습니다. =>switch(string.toLowerCase()) {case "false": case "no": case "0": case "": return false; default: return true;}
Robert

15
@Robert, 좋은 것이지만 false대신 기본값을 사용합니다.
drigoangelo

@ drigoangelo default: return true;가 가능합니다. 그러나 함수의 동작을 변경합니다.
Robert

2
나는 이것이 최선의 대답이라고 생각하고 여기에서 자세히 설명하고 싶었다 : stackoverflow.com/questions/263965/…
BrDaHa

9
.toLowerCase ()를 호출하여 데이터를 정규화하는 경우, 공백을 제거하기 위해 trim ()을 던지기를 원할 수도 있습니다.
jCuga

174

나는 이것이 매우 보편적이라고 생각합니다.

if (String(a) == "true") ...

간다 :

String(true) == "true"     //returns true
String(false) == "true"    //returns false
String("true") == "true"   //returns true
String("false") == "true"  //returns false

20
대문자 또는 부울 문자열을받을 수있는 경우String(a).toLowerCase() === 'true'
pauloya

String("what about input like this that isn't a bool?") == "true"
Thomas Eding

6
@ThomasEding false ... 무엇을 반환 하시겠습니까?
Snowburnt

2
String()생성자를 사용하지 않음으로써 단축 할 수도 있습니다 :true+'' === 'true' // true
Todd

1
BTW, 1 또는 0의 경우에도 거짓 또는 참으로 표시되어야합니다.
Miguel

128

대소 문자를 일치시켜야합니다.

var isTrueSet = (myValue.toLowerCase() === 'true');

또한 양식 요소 확인란 인 경우 확인란이 선택되어 있는지 확인할 수도 있습니다.

var isTrueSet = document.myForm.IS_TRUE.checked;

체크되어 있다고 가정하면, "set"은 true와 같습니다. 이것은 참 / 거짓으로 평가됩니다.


3
이 경우 예외가 발생합니다 myValue될 일 null, true또는 다른 유형의 ...
mik01aj

116

정규식을 사용할 수 있습니다.

/*
 * Converts a string to a bool.
 *
 * This conversion will:
 *
 *  - match 'true', 'on', or '1' as true.
 *  - ignore all white-space padding
 *  - ignore capitalization (case).
 *
 * '  tRue  ','ON', and '1   ' will all evaluate as true.
 *
 */
function strToBool(s)
{
    // will match one and only one of the string 'true','1', or 'on' rerardless
    // of capitalization and regardless off surrounding white-space.
    //
    regex=/^\s*(true|1|on)\s*$/i

    return regex.test(s);
}

String 클래스를 확장하고 싶다면 다음을 수행하십시오.

String.prototype.bool = function() {
    return strToBool(this);
};

alert("true".bool());

이것을 얻기 위해 String 객체를 확장하고 싶지만 열거 가능성에 대해 걱정하고 String 객체를 확장하는 다른 코드와 충돌하는 것을 걱정하는 사람들 (주석 참조)의 경우 :

Object.defineProperty(String.prototype, "com_example_bool", {
    get : function() {
        return (/^(true|1)$/i).test(this);
    }
});
alert("true".com_example_bool);

(오래된 브라우저에서는 작동하지 않으며 Opera, Chrome, Safari 및 IE는 true 인 반면 Firefox는 false를 표시합니다. 버그 720760 )


10
함수가 다른 코드를 방해 할 것을 두려워하는 경우 항상 함수 앞에 접두사를 붙일 수 있습니다. 일부 코드가 여전히 끊어지면 해당 코드는 너무 취하기 쉬우므로 수정해야합니다. 추가 된 함수로 인해 다른 코드의 성능 문제가 발생하는 곳에서 객체가 너무 무거워지면 분명히 그렇게하고 싶지 않습니다. 그러나 내장 객체를 확장하는 것은 일반적으로 나쁜 생각이라고 생각하지 않습니다. 또한 그러한 경우 공개적으로 확장 할 수 없습니다.
Shadow2531

41
@DTrejo @Szymon 동의하지 않습니다. 이것은 프로토 타입에 과부하가 걸리는 것입니다. for..in에 의존하는 (가난한) 코드를 깨는 것이 두려운 경우 열거에서 속성을 숨기는 방법이 있습니다. 참조하십시오 Object.defineProperty.
devios1

컨벤션을 따르기 위해 그것을 parseBool
부르겠습니다

8
부울 파싱은 String 클래스에 속하지 않습니다. 결국 많은 양의 파서와 변환이 발생합니다. 일반적으로 프로토 타입 변경에 -1. 브라우저 간 작동하지 않는 솔루션의 경우 -1입니다. 열악한 디자인의 경우 -1입니다.
Thomas W

1
다음은 모든 답변의 성능 비교입니다. stackoverflow.com/a/28588344/2824333
sospedra

50

우드 아이는 조심해야합니다. 500 개 이상의 공감 율로 최고 답변을 적용한 후 결과를 본 후 실제로 유용한 내용을 게시 할 의무가 있습니다.

가장 짧지 만 매우 엄격한 방법으로 시작하겠습니다.

var str = "true";
var mybool = JSON.parse(str);

그리고 더 적절하고 관용적 인 방법으로 끝내십시오.

var parseBool = function(str) 
{
    // console.log(typeof str);
    // strict: JSON.parse(str)

    if(str == null)
        return false;

    if (typeof str === 'boolean')
    {
        return (str === true);
    } 

    if(typeof str === 'string')
    {
        if(str == "")
            return false;

        str = str.replace(/^\s+|\s+$/g, '');
        if(str.toLowerCase() == 'true' || str.toLowerCase() == 'yes')
            return true;

        str = str.replace(/,/g, '.');
        str = str.replace(/^\s*\-\s*/g, '-');
    }

    // var isNum = string.match(/^[0-9]+$/) != null;
    // var isNum = /^\d+$/.test(str);
    if(!isNaN(str))
        return (parseFloat(str) != 0);

    return false;
}

테스트 :

var array_1 = new Array(true, 1, "1",-1, "-1", " - 1", "true", "TrUe", "  true  ", "  TrUe", 1/0, "1.5", "1,5", 1.5, 5, -3, -0.1, 0.1, " - 0.1", Infinity, "Infinity", -Infinity, "-Infinity"," - Infinity", " yEs");

var array_2 = new Array(null, "", false, "false", "   false   ", " f alse", "FaLsE", 0, "00", "1/0", 0.0, "0.0", "0,0", "100a", "1 00", " 0 ", 0.0, "0.0", -0.0, "-0.0", " -1a ", "abc");


for(var i =0; i < array_1.length;++i){ console.log("array_1["+i+"] ("+array_1[i]+"): " + parseBool(array_1[i]));}

for(var i =0; i < array_2.length;++i){ console.log("array_2["+i+"] ("+array_2[i]+"): " + parseBool(array_2[i]));}

for(var i =0; i < array_1.length;++i){ console.log(parseBool(array_1[i]));}
for(var i =0; i < array_2.length;++i){ console.log(parseBool(array_2[i]));}

첫 번째 방법을 사용하는 경우 이전 브라우저에는 JSON 폴리 필이 필요할 수 있습니다.
DRaehal

1
?로 "false"문자열을 false부울 값으로 캐스팅하는 것이 얼마나 빠릅 JSON.parse니까? CPU, 메모리 성능 측면에서
녹색

이미 잘못된 것을 제거하기 위해 if (str) {...}로 시작하는 것이 더 쉽지 않습니까? 그리고이 if 조건 내에서 이미 return false로 끝나기 때문에 true를 반환하는 것에 대해 걱정해야합니다!
Larphoid

([ "true", "yes", "1"]. indexOf (str.toLowerCase (). trim ())! = -1)을 사용하여 많은 문자열 테스트를 단축하고 폴백을 사용할 수 있습니다. 'null'과 같은 것을 포함하는 부울 (str)
Scott

38

@Steven의 대답이 가장 좋은 것이라고 생각하고 들어오는 값이 문자열 인 경우보다 훨씬 더 많은 경우를 처리했습니다. 나는 그것을 조금 확장하고 다음을 제공하고 싶었다.

function isTrue(value){
    if (typeof(value) === 'string'){
        value = value.trim().toLowerCase();
    }
    switch(value){
        case true:
        case "true":
        case 1:
        case "1":
        case "on":
        case "yes":
            return true;
        default: 
            return false;
    }
}

설명해야 할 모든 false사례를 이미 알고 있는 경우 모든 사례 를 다룰 필요는 없습니다 true. 이 메소드에 true값을 전달할 수있는 모든 것을 전달할 수 있으며 (또는 다른 것을 추가하면 매우 간단합니다), 다른 모든 것이 고려됩니다.false


필자는이 글을 XML / HTML ElementNodes 속성에서 얻을 수있는 것들을 다룰 때 사용한다autocomplete="on"
philk

2
나는와 toLowerCase () 전에 () .trim 추가합니다
루이스 로보 Borobia

34

JSON 구문 분석을 사용한 범용 솔루션 :

function getBool(val) {
    return !!JSON.parse(String(val).toLowerCase());
}

getBool("1"); //true
getBool("0"); //false
getBool("true"); //true
getBool("false"); //false
getBool("TRUE"); //true
getBool("FALSE"); //false

업데이트 (JSON 제외) :

function getBool(val){ 
    var num = +val;
    return !isNaN(num) ? !!num : !!String(val).toLowerCase().replace(!!0,'');
}

나는 또한 그것을 테스트하기 위해 바이올린을 만들었습니다 http://jsfiddle.net/remunda/2GRhG/


1
'JSON없이'버전에는 몇 가지 결함이 있습니다. val = "0"; console.log (!! (+ val || String (val) .toLowerCase (). replace (!! 0, ''))); 진정한 생산
에티엔 느

3
getBool(undefined)원래 JSON 버전을 사용할 때 충돌하고 두 번째 버전에 대해서는 true를 반환합니다. 다음은 false를 반환하는 세 번째 버전입니다. function getBool (val) {var num; return val! = null && (! isNaN (num = + val)? !! num : !! String (val) .toLowerCase (). replace (!! 0, '')); }
Ron Martinez

31

당신의 해결책은 괜찮습니다.

===이 경우 필드 value는 항상 이므로 사용하는 것은 어리석은 일입니다 String.


17
왜 어리석은 것이라고 생각 ===하십니까? 성능면에서 두 유형이 모두 문자열 인 경우 정확히 동일합니다. 어쨌든, 나는 ===항상 ==and 의 사용을 피하기 때문에 오히려 사용 !=합니다. 정당성 : stackoverflow.com/questions/359494/…
Mariano Desanze

3
때문에 value항상 것 string==아니다은 ===바보입니다. 둘 다이 작업에 적합한 도구입니다. 유형이 같지 않을 때만 다릅니다 . 이 경우 비교하기 전에 복잡한 유형 강제 알고리즘 을 실행하는 동안 ===단순히 반환 됩니다. false==
Robert

23
var falsy = /^(?:f(?:alse)?|no?|0+)$/i;
Boolean.parse = function(val) { 
    return !falsy.test(val) && !!val;
};

이 반환 false모든 falsy 값과 true를 제외한 모든 truthy 값 'false', 'f', 'no', 'n', 및 '0'(대소 문자 구분).

// False
Boolean.parse(false);
Boolean.parse('false');
Boolean.parse('False');
Boolean.parse('FALSE');
Boolean.parse('f');
Boolean.parse('F');
Boolean.parse('no');
Boolean.parse('No');
Boolean.parse('NO');
Boolean.parse('n');
Boolean.parse('N');
Boolean.parse('0');
Boolean.parse('');
Boolean.parse(0);
Boolean.parse(null);
Boolean.parse(undefined);
Boolean.parse(NaN);
Boolean.parse();

//True
Boolean.parse(true);
Boolean.parse('true');
Boolean.parse('True');
Boolean.parse('t');
Boolean.parse('yes');
Boolean.parse('YES');
Boolean.parse('y');
Boolean.parse('1');
Boolean.parse('foo');
Boolean.parse({});
Boolean.parse(1);
Boolean.parse(-1);
Boolean.parse(new Date());

20

부울 객체에는 'parse'메소드가 없습니다. Boolean('false')true를 반환하므로 작동하지 않습니다. !!'false'또한 반환true 하므로 작동하지 않습니다.

문자열 'true'이 부울을 반환 true하고 문자열 'false'이 부울을 반환 false하도록하려면 가장 간단한 해결책을 사용하는 것 eval()입니다. eval('true')true를 eval('false')반환하고 false를 반환합니다 . eval()그래도 성능에 영향을 미칩니다 .


eval과 함께 "잘못된"(또는 올바른) 내용을 이해하려면 javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval 과 같은 기사를 확인 하거나 'Javascript eval 악성 코드'에 대한 stackoverflow 검색
GrahamMc

2
나는 var isTrueSet = (myValue === 'true');이것이 최선의 대답 이라는 데 동의합니다 .
thdoan

나는 그것이 간결하다는 것을 좋아합니다. 그러나 기본적인 경우에는 굉장히 실패합니다 eval('TRUE'). 다시 한 번 증명, 그것은 eval()악하다.
눈사람

@Area 51 Detective Fiction도 같은 방식으로 JSON.parse('TRUE')아래 답변에서 크게 실패합니다. JavaScript (또는 그 문제에 대한 모든 언어)에서 오류 조건을 적용하는 것은 매우 쉽습니다. 이를 설명하기 위해 먼저 문자열을 정규화해야합니다. 예 :var myValue = document.myForm.IS_TRUE.value.toLowerCase(); var isTrueSet = (myValue==='true' || myValue==='false') ? eval(myValue) : false;
thdoan

1
@ 10basetom : 아주 맞습니다. 당신은 .toLowerCase()대답에 내 요점을 포함시켜야 합니다. 나는 아무것도 강요하려고하지 않습니다. 대문자 TRUE는 많은 UI 위젯에서 리턴 할 수있는 공통 값입니다.
눈사람

17

이것은 받아 들인 대답에서 가져 왔지만 실제로는 매우 약한 점이 있습니다. 대소수에 민감하지 않기 때문에 문자열의 대소 문자를 고려해야하는 문제는 얼마나 많은 공짜를 얻었는지에 놀랐습니다.

var isTrueSet = (myValue.toLowerCase() === 'true');

16

나는 다음을 사용한다 :

function parseBool(b) {
    return !(/^(false|0)$/i).test(b) && !!b;
}

이 함수는 문자열 "false"(대 / 소문자 구분 안 함) 및 "0"을 제외하고 일반적인 부울 강제 변환을 수행합니다.


16

많은 답변이 있으며 하나를 선택하기가 어렵습니다. 필자의 경우 선택할 때 성능의 우선 순위를 지정 하므로이 jsPerf를 만듭니다. 여기에 약간의 빛을 던질 수있는 를 .

결과 요약 (높을수록 좋음) :

  1. 조건문 : 2,826,922
  2. Bool 오브젝트의 케이스 전환 : 2,825,469
  3. JSON으로 전송 : 1,867,774
  4. !! 전환 : 805,322
  5. 문자열 프로토 타입 : 713,637

그것들은 당신이 각각에 대한 더 많은 정보 (장단점)를 찾을 수있는 관련 답변에 연결되어 있습니다. 특별히 의견에.


jsPerf 테스트를 보려고 할 때 "뭔가 잘못되었습니다"
spottedmahn

13
Boolean.parse = function (str) {
  switch (str.toLowerCase ()) {
    case "true":
      return true;
    case "false":
      return false;
    default:
      throw new Error ("Boolean.parse: Cannot convert string to boolean.");
  }
};

2
"true"대신에 true.toString ()을 사용하면 훨씬 더 깨끗해질 수 있습니다.-)
tillda

전 세계를 바꾸지 말고, 변화를 고립 시키려고 노력하고, function parseBoolean대신 새로운 것을 만들어보십시오
Steel Brain

13

당신이 찾고있는 표현은

/^true$/i.test(myValue)

에서와 같이

var isTrueSet = /^true$/i.test(myValue);

이 테스트 myValue 대소 문자를 구분하지 않는 정규식에 대해 하며 프로토 타입을 수정하지 않습니다.

예 :

/^true$/i.test("true"); // true
/^true$/i.test("TRUE"); // true
/^true$/i.test("tRuE"); // true
/^true$/i.test(" tRuE"); // false (notice the space at the beginning)
/^true$/i.test("untrue"); // false (some other solutions here will incorrectly return true
/^true$/i.test("false");// returns false
/^true$/i.test("xyz");  // returns false

12

string ( "true", "false") 및 boolean을 모두 부울로 변환하려면

('' + flag) === "true"

어디에서 flag할 수 있습니다

 var flag = true
 var flag = "true"
 var flag = false
 var flag = "false"

12

이미 많은 답변이 있습니다. 그러나 다음 시나리오는 일부 시나리오에서 유용 할 수 있습니다.

// One can specify all values against which you consider truthy
var TRUTHY_VALUES = [true, 'true', 1];

function getBoolean(a) {
    return TRUTHY_VALUES.some(function(t) {
        return t === a;
    });
}

부울 값이 아닌 예제가있는 경우 유용 할 수 있습니다.

getBoolean('aa'); // false
getBoolean(false); //false
getBoolean('false'); //false

getBoolean('true'); // true
getBoolean(true); // true
getBoolean(1); // true

10

왜 이런 식으로 시도하지 않습니까

Boolean(JSON.parse((yourString.toString()).toLowerCase()));

대소 문자와 상관없이 true 또는 false가 아닌 다른 텍스트가 제공되면 오류를 반환하고 숫자를 다음과 같이 캡처합니다.

// 0-> false
// any other number -> true

10

이 함수는 문자열과 부울 true / false를 처리 할 수 ​​있습니다.

function stringToBoolean(val){
    var a = {
        'true':true,
        'false':false
    };
    return a[val];
}

아래 데모 :

function stringToBoolean(val) {
  var a = {
    'true': true,
    'false': false
  };
  return a[val];
}

console.log(stringToBoolean("true"));

console.log(typeof(stringToBoolean("true")));

console.log(stringToBoolean("false"));

console.log(typeof(stringToBoolean("false")));

console.log(stringToBoolean(true));

console.log(typeof(stringToBoolean(true)));

console.log(stringToBoolean(false));

console.log(typeof(stringToBoolean(false)));

console.log("=============================================");
// what if value was undefined? 
console.log("undefined result:  " + stringToBoolean(undefined));
console.log("type of undefined result:  " + typeof(stringToBoolean(undefined)));
console.log("=============================================");
// what if value was an unrelated string?
console.log("unrelated string result:  " + stringToBoolean("hello world"));
console.log("type of unrelated string result:  " + typeof(stringToBoolean(undefined)));


9

나는 이것을 사용하고 있습니다

String.prototype.maybeBool = function(){

    if ( ["yes", "true", "1", "on"].indexOf( this.toLowerCase() ) !== -1 ) return true;
    if ( ["no", "false", "0", "off"].indexOf( this.toLowerCase() ) !== -1 ) return false;

    return this;

}

"on".maybeBool(); //returns true;
"off".maybeBool(); //returns false;
"I like js".maybeBool(); //returns "I like js"

이것은 좋지만 문자열 유형에서만 작동합니다. 이 변수가 아마도 "true"또는 변수에 의해 사용될 필요가 있다고 상상해보십시오 true. 두 번째로 오면 작동하지 않습니다. 가능하게 된 A는 document.prototype우리가 원하는 목적지 이것을 사용하려면?
MarceloBarbosa

이것은 우아해 보인다. 잘 했어! 그러나 대형 JS 앱에서 기본 프로토 타입을 오버로드하면 (단위 테스트가 필요함) 예기치 않은 동작이 발생할 수 있습니다 (즉, 프로토 타입이 오버로드 된 배열을 통해 "for"로 반복하려는 경우 일반적으로 기대하지 않는 일부 속성). 경고를 받았습니다. ;)
cassi.lup

boolean도 허용하는 함수 변형 StringOrElse2Bool (sob) {if (typeof sob === "string") {return [ "no", "false", "0", "off"]. indexOf (sob.toLowerCase ())! == -1? 거짓 : 참; } else {return !!
sob

8

가장 쉬운 방법은 다음과 같습니다 (문자열이 'true'또는 'false'라고 가정).

var z = 'true';
var y = 'false';
var b = (z === 'true'); // will evaluate to true
var c = (y === 'true'); // will evaluate to false

이러한 유형의 변환에는 항상 == 연산자 대신 === 연산자를 사용하십시오!


4
어떤 전환에 대해 이야기하고 있었습니까? :-)
YMMD

1
자바 스크립트에서 문자열을 비교할 때 변환을 사용하지 않을 때 == 또는 === 연산자를 사용하는 것에는 차이가 없습니다. 여기서는 문자열과 비교하므로 유형 변환이 없습니다. 참조 stackoverflow.com/questions/359494/...
ars265

8

@ Shadow2531이 말했듯이 직접 변환 할 수는 없습니다. 또한 코드가 다른 사람에 의해 재사용 / 사용될 경우 "참"및 "거짓"인 "true"및 "false"이외의 문자열 입력을 고려하는 것이 좋습니다. 이것이 내가 사용하는 것입니다 :

function parseBoolean(string) {
  switch (String(string).toLowerCase()) {
    case "true":
    case "1":
    case "yes":
    case "y":
      return true;
    case "false":
    case "0":
    case "no":
    case "n":
      return false;
    default:
      //you could throw an error, but 'undefined' seems a more logical reply
      return undefined;
  }
}

7

선택의 가치와 그 가치의 표현을 (생각 적으로) 분리해야합니다.

자바 스크립트 로직에서 문자열 센티넬에서 기본 유형으로 전환해야하는 지점을 선택하고 비교해야합니다. 바람직하게는 변환해야하는 각 값에 대해 한 번만 수행됩니다. 문자열 센티넬이 스크립트가 아는 것이 아니라면 어떤 일이 발생해야하는지 기억해야합니다 (예 : 기본값은 true 또는 false입니까?)

다시 말해, 문자열 값에 의존해야합니다. :-)


7

이 질문에 대한 나의 견해는 세 가지 목표를 충족시키는 것입니다.

  • true 및 false 값의 경우 true / false를 반환하지만 문자열 대신 부울 인 경우 true 또는 false 인 여러 문자열 값의 경우 true / false를 반환합니다.
  • 둘째, 지정된 값 이외의 값은 실패하지 않고 오히려 기본값을 반환하도록 복원력있는 인터페이스를 제공하십시오.
  • 셋째, 가능한 적은 코드로이 모든 작업을 수행하십시오.

JSON 사용의 문제점은 Javascript 오류를 발생시켜 실패한다는 것입니다. 이 솔루션은 탄력적이지 않습니다 (1과 3을 만족하더라도).

JSON.parse("FALSE") // fails

이 솔루션은 간결하지 않습니다.

if(value === "TRUE" || value === "yes" || ...) { return true; }

Typecast.js에 대한이 정확한 문제를 해결하기 위해 노력하고 있습니다. 세 가지 목표 모두에 대한 최상의 솔루션은 다음과 같습니다.

return /^true$/i.test(v);

많은 경우에 작동하며 {}와 같은 값이 전달 될 때 실패하지 않으며 매우 간결합니다. 또한 정의되지 않거나 오류를 발생시키는 것이 아니라 기본값으로 false를 반환하므로 느슨하게 형식화 된 Javascript 개발에 더 유용합니다. 그것을 제안한 다른 답변에 브라보!


목표로 돌아 가기 위해 세 번째 & 최상의 솔루션의 유일한 문제는 목표 # 1을 충족시키지 못한다는 것입니다. 값이-인 경우에만 true를 반환 'true'하지만 진실한 입력은하지 않습니다. 목표 # 1을 충족시키기 위해 솔루션 # 2보다 약간 간결하고 읽기 쉽지 않습니다.
JMTyler

return /^(true|yes|1|t|y)$/i.test(str);
Kevin Boucher

7

조금 늦었지만이 작업을 수행하기 위해 약간의 스 니펫이 있습니다 .JScript의 모든 진실 / 거짓 / 더러움을 유지하지만 "false"false에 대한 허용 가능한 값으로 포함 합니다.

필자가 언급 한 것 보다이 방법을 선호합니다. 제 3자가 코드를 구문 분석하는 데 의존하지 않기 때문에 (예 : eval / JSON.parse) 내 마음에 너무 잔인합니다. 유틸리티 기능을 필요로하지 않고 유지 보수가 충분하지 않습니다. 다른 진실 / 거짓말 협약.

var value = "false";
var result = (value == "false") != Boolean(value);

// value = "true"  => result = true
// value = "false" => result = false
// value = true    => result = true
// value = false   => result = false
// value = null    => result = false
// value = []      => result = true
// etc..

7

다른 해결책. jsFiddle

var toBoolean = function(value) {
    var strValue = String(value).toLowerCase();
    strValue = ((!isNaN(strValue) && strValue !== '0') &&
        strValue !== '' &&
        strValue !== 'null' &&
        strValue !== 'undefined') ? '1' : strValue;
    return strValue === 'true' || strValue === '1' ? true : false
};

테스트 사례는 노드에서 실행

> toBoolean(true)
true
> toBoolean(false)
false
> toBoolean(undefined)
false
> toBoolean(null)
false
> toBoolean('true')
true
> toBoolean('True')
true
> toBoolean('False')
false
> toBoolean('false')
false
> toBoolean('0')
false
> toBoolean('1')
true
> toBoolean('100')
true
> 

7

이런 하나님의 답변 중 일부는 야생입니다. 나는 JS와 부울을 스키닝하는 수많은 방법을 좋아합니다.

내가 아직 보지 못했던 내 선호는 다음과 같습니다.

testVar = testVar.toString().match(/^(true|[1-9][0-9]*|[0-9]*[1-9]+|yes)$/i) ? true : false;

6

짧막 한 농담

다른 문자열 ( "true"포함)이 이미 있으므로 "false"문자열 만 고려하면됩니다 true.

function b(v){ return v==="false" ? false : !!v; }

테스트

b(true)    //true
b('true')  //true
b(false)   //false
b('false') //false

더 풍성한 버전

function bool(v){ return v==="false" || v==="null" || v==="NaN" || v==="undefined" || v==="0" ? false : !!v; }

테스트

bool(true)        //true
bool("true")      //true
bool(1)           //true
bool("1")         //true
bool("hello")     //true

bool(false)       //false
bool("false")     //false
bool(0)           //false
bool("0")         //false
bool(null)        //false
bool("null")      //false
bool(NaN)         //false
bool("NaN")       //false
bool(undefined)   //false
bool("undefined") //false
bool("")          //false

bool([])          //true
bool({})          //true
bool(alert)       //true
bool(window)      //true
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.