질문자 :Community Wiki
부울 값(예: 'true', 'false')을 나타내는 문자열을 JavaScript에서 내장 유형으로 변환할 수 있습니까?
목록 내에서 사용자의 선택에 따라 업데이트되는 HTML에 숨겨진 양식이 있습니다. 이 양식에는 부울 값을 나타내고 고유 부울 값으로 동적으로 채워지는 일부 필드가 포함되어 있습니다. 그러나 이 값이 숨겨진 입력 필드에 배치되면 문자열이 됩니다.
필드의 부울 값을 결정하기 위해 찾을 수 있는 유일한 방법은 필드가 문자열로 변환되면 문자열 표현의 리터럴 값에 의존하는 것입니다.
var myValue = document.myForm.IS_TRUE.value; var isTrueSet = myValue == 'true';
이 작업을 수행하는 더 좋은 방법이 있습니까?
하다:
var isTrueSet = (myValue === 'true');
비교 변수의 유형이 다른 경우 암시적 유형 변환을 수행하지 않는 식별 연산자( ===
하지마:
특정 요구 사항에 대해 다음 두 가지 방법을 사용하는 데 주의해야 합니다.
var myBool = Boolean("false"); // == true var myBool = !!"false"; // == true
빈 문자열이 아닌 모든 문자열은 이를 사용하여 true
부울 변환과 관련하여 생각할 수 있는 가장 깨끗한 방법이지만 원하는 것이 아니라고 생각합니다.
Community Wiki경고
많이 추천된 이 레거시 답변은 기술적으로 정확하지만 문자열 값이 정확히 "true"
또는 "false"
인 경우 매우 구체적인 시나리오만 다룹니다.
아래의 이러한 함수에 잘못된 json 문자열이 전달 되면 예외가 발생 합니다.
원래 답변:
어때요?
JSON.parse("True".toLowerCase());
또는 jQuery로
$.parseJSON("TRUE".toLowerCase());
Community WikistringToBoolean: 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); } }
Community Wiki나는 이것이 훨씬 보편적이라고 생각합니다.
if (String(a).toLowerCase() == "true")
...
그것은 간다:
String(true) == "true" //returns true String(false) == "true" //returns false String("true") == "true" //returns true String("false") == "true" //returns false
Community Wiki대소문자를 일치시키는 것을 기억하십시오:
var isTrueSet = (myValue.toLowerCase() === 'true');
또한 양식 요소 확인란인 경우 확인란이 선택되어 있는지 감지할 수도 있습니다.
var isTrueSet = document.myForm.IS_TRUE.checked;
체크되어 있으면 true로 "설정"된다고 가정합니다. 이것은 참/거짓으로 평가됩니다.
Community Wiki정규 표현식을 사용할 수 있습니다.
/* * 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);
(물론 구형 브라우저에서는 작동하지 않으며 Firefox는 false로 표시되지만 Opera, Chrome, Safari 및 IE는 true로 표시됩니다. Bug 720760 )
Community Wiki나무눈 조심하세요. 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]));}
Community Wiki@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; } }
true
사례를 이미 알고 있는 경우 false
사례를 다룰 필요는 없습니다. true
값을 전달할 수 있는 모든 것을 이 메서드에 전달할 수 있으며(또는 다른 것을 추가하는 것은 매우 간단합니다), 다른 모든 것은 false
Community WikiJSON 구문 분석이 포함된 범용 솔루션:
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/remanda/2GRhG/
Community Wiki귀하의 솔루션은 괜찮습니다.
value
이 항상 String
===
사용하는 것은 이 경우 어리석은 일입니다.
Community Wikivar 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());
Community WikiBoolean 객체에는 'parse' 메소드가 없습니다. Boolean('false')
은 true를 반환하므로 작동하지 않습니다. !!'false'
true
를 반환하므로 작동하지 않습니다.
문자열 'true'
가 부울 true
를 반환하고 문자열 'false'
가 부울 false
를 반환하도록 하려면 가장 간단한 솔루션은 eval()
을 사용하는 것입니다. eval('true')
은 true를 반환하고 eval('false')
은 false를 반환합니다. eval()
사용할 때 성능에 미치는 영향을 염두에 두십시오.
Community Wiki답은 많은데 하나를 고르기가 어렵다. 제 경우에는 선택 시 성능을 우선시하므로 여기에서 빛을 발할 수 있기를 바라는 이 jsPerf를 만듭니다.
결과 요약(높을수록 좋음):
- 조건문 : 2,826,922
- Bool 객체의 스위치 케이스 : 2,825,469
- JSON으로 캐스팅 : 1,867,774
- !! 전환수 : 805,322
- 문자열 프로토타입 : 713,637
그것들은 각각에 대한 더 많은 정보(장단점)를 찾을 수 있는 관련 답변에 연결되어 있습니다. 특히 댓글에.
Community Wiki이것은 허용 된 답변에서 가져 왔지만 실제로는 매우 약한 점이 있으며 찬성 수를 어떻게 얻었는지 충격을 받았으며 대소문자를 구분하기 때문에 문자열의 대소문자를 고려해야 한다는 문제가 있습니다.
var isTrueSet = (myValue.toLowerCase() === 'true');
Community Wiki나는 다음을 사용합니다.
function parseBool(b) { return !(/^(false|0)$/i).test(b) && !!b; }
이 함수는 "false"(대소문자 구분하지 않음) 및 "0" 문자열을 제외하고 일반적인 부울 강제 변환을 수행합니다.
Community Wiki이미 사용 가능한 답변이 너무 많습니다. 그러나 다음은 일부 시나리오에서 유용할 수 있습니다.
// 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
Community WikiBoolean.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."); } };
Community Wiki당신이 찾고있는 표현은 단순히
/^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
Community Wikistring("true", "false") 및 부울을 부울로 변환하려면
('' + flag) === "true"
flag
이 있을 수 있는 곳
var flag = true var flag = "true" var flag = false var flag = "false"
Community Wiki다음과 같이 JSON.parse
를 사용할 수 있습니다.
var trueOrFalse='True'; result =JSON.parse(trueOrFalse.toLowerCase()); if(result==true) alert('this is true'); else alert('this is false');
이 경우 .toLowerCase
가 중요합니다.
Community Wiki이 함수는 문자열뿐만 아니라 부울 참/거짓도 처리할 수 있습니다.
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)));
Community Wiki가장 간단한 솔루션
ES6+
논리 NOT을 두 번 사용 [ !! ] 변환된 문자열을 얻으려면
이 표현을 붙여넣기만 하면...
const stringToBoolean = (string) => string === 'false' ? false : !!string
그리고 문자열을 전달하십시오!
stringToBoolean('') // false stringToBoolean('false') // false stringToBoolean('true') // true stringToBoolean('hello my friend!') // true
보너스!
const betterStringToBoolean = (string) => string === 'false' || string === 'undefined' || string === 'null' || string === '0' ? false : !!string
이 표현식의 사용을 쉽게 확장하기 위해 원하는 대로 다른 문자열을 포함할 수 있습니다...:
betterStringToBoolean('undefined') // false betterStringToBoolean('null') // false betterStringToBoolean('0') // false betterStringToBoolean('false') // false betterStringToBoolean('') // false betterStringToBoolean('true') // true betterStringToBoolean('anything else') // true
Community Wiki이것은 내가 최근에 만난 가장 쉬운 부울 변환 방법입니다. 추가할 생각입니다.
JSON.parse('true');
let trueResponse = JSON.parse('true'); let falseResponse = JSON.parse('false'); console.log(trueResponse); console.log(falseResponse);
Community Wiki나는 이것을 사용하고있다
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"
Community Wiki왜 이런 걸 시도하지 않니
Boolean(JSON.parse((yourString.toString()).toLowerCase()));
대/소문자에 관계없이 true 또는 false가 아닌 다른 텍스트가 제공되면 오류를 반환하고 숫자도 다음과 같이 캡처합니다.
// 0-> false // any other number -> true
Community Wiki선택의 가치와 그 가치의 표현을 분리해야 합니다.
JavaScript 논리에서 문자열 센티넬에서 기본 유형으로 전환해야 하는 지점을 선택하고 거기에서 비교를 수행합니다. 가급적이면 변환해야 하는 각 값에 대해 한 번만 수행하는 것이 좋습니다. 문자열 sentinel이 스크립트가 알고 있는 것이 아닌 경우(즉, 기본적으로 true로 설정되어 있는지 아니면 false로 설정되어 있는지) 문제를 해결하는 것을 기억하십시오.
즉, 문자열 값에 의존해야 합니다. :-)
Community Wiki짧막 한 농담
다른 문자열("true" 포함)이 이미 true
이므로 "false" 문자열만 고려하면 됩니다.
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
Community Wiki가장 쉬운 방법은 다음과 같습니다(문자열이 'true' 또는 'false'라고 가정).
var z = 'true'; var y = 'false'; var b = (z === 'true'); // will evaluate to true var c = (y === 'true'); // will evaluate to false
언제나
Community Wiki@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; } }
Community Wiki또 다른 솔루션. 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 >
Community Wiki출처 : http:www.stackoverflow.com/questions/263965/how-can-i-convert-a-string-to-boolean-in-javascript