JavaScriptで文字列をブール値に変換するにはどうすればよいですか?


2553

ブール値(「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);
マークKコーワン

3
文字列とブール値を簡単に処理:function parseBool(val) { return val === true || val === "true" }
WickyNilliams

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

回答:


3482

行う:

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

===等価演算子(==)の代わりに、比較される変数の型が異なる場合に暗黙の型変換を行わない識別演算子()を使用して、より厳密にすることができます。

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

してはいけないこと:

特定のニーズにこれらの2つの方法使用する場合は、おそらく注意が必要です。

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

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

空の文字列ではない文字列は、trueそれらを使用して評価されます。これらは、ブール変換に関して考えることができる最もクリーンな方法ですが、あなたが探しているものではないと思います。


196
myValue === 'true';はとまったく同じmyValue == 'true';です。ここで使用===してもメリットはありません==
Tim Down

551
私は続くクロックフォードのアドバイスや使用を===し、!==いつでも、それはほとんど常にある、理にかなっています。
guinaps

55
たとえば、すべて大文字の「TRUE」はどうですか?
BMiner 2011

102
@guinaps私は通常Crockfordのアドバイスに従いますが、==vs。===シナリオは私が従わない数少ないシナリオの1つです。「ほとんどの場合」を使用することが理にかなっていることにはまったく同意しません===。タイプが気になりたくないので、緩やかに型付けされた言語が存在します。if (price >= 50)文字列として始まっていても気にしないようなものをチェックした場合。私は、ほとんどの場合、型をジャグリングして欲しいと言っています。タイプジャグリング(たとえばif (price === null))が不要なまれなケースでは、を使用します===。これは私が何年もやってきたことであり、問題は一度もありませんでした。
JMTyler 2013年

169
@JMTylerは、後に来るメンテナンスプログラマを見落としている可能性があります。常に適切な比較演算子を使用してください!両側の型を「確かに」知っているが、===を使用しない場合、後でコードを見るときにその知識がありません。コードが再利用される場合、これは悪夢になる可能性があります。あなたが言うように本当にタイプを「ジャグリング」したい場合は、「==」を使用しますが、あまりにも多くのJS開発者がこれを簡単にトリップするため、コードを引き締める方が良いでしょう。どのくらいの頻度で文字列「false」にブール値「true」を指定しますか?
アイケル2013

687

警告

この非常に支持されたレガシー回答は技術的には正しいですが、文字列値がEXACTLY "true"またはの場合の非常に特定のシナリオのみをカバーしています"false"

以下の関数に渡された無効なjson文字列は例外をスローします


元の答え:

どう?

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

またはjQuery

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

62
これの問題は、多くの潜在的な値がJSの実行を停止する解析エラーを生成することです。つまり、JSON.parse( "FALSE")を実行するとJavascriptが爆破されます。問題の要点は、これらの正確なケースを単に解決することではなく、他のケースに対して回復力があることだと私は思います。
BishopZ 2013年

3
@Lukeこのソリューションは、実際には私が必要としていたものとまったく同じです。ええと、それをtry ... catchでラップしています。文字列内のブール値である場合にのみboolに変換したいと思いました。それ以外の場合は、提供された文字列を使用してください。これでうまくいきます!ありがとう。
jedmao 2013年

47
JSON.parse("TRUE".toLowerCase())正しく解析できるように言うのは非常に簡単です。
Yuck 2013

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 2017年

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 2013年

@drigoangelo持つことdefault: return true;は確かに可能です。ただし、関数の動作が変更されます。
ロバート

2
私は、これが最良の答えだと思った、とここでそれについて詳しく説明したい:stackoverflow.com/questions/263965/...
BrDaHa

9
.toLowerCase()を呼び出してデータを正規化している場合は、trim()をスローして空白も
削除することをお勧め

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 '29

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

6
@ThomasEding false ...何を返して欲しいですか?
Snowburnt 2013年

2
でも、使っていないことで短縮できString()コンストラクタを:true+'' === 'true' // true
トッド・

1
ところで、1または0の場合は、falseまたはtrueにもキャストする必要があります
ミゲル

128

大文字と小文字を一致させることを忘れないでください:

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

また、フォーム要素のチェックボックスの場合は、チェックボックスがオンになっているかどうかを検出することもできます。

var isTrueSet = document.myForm.IS_TRUE.checked;

チェックされている場合は、trueに「設定」されていると仮定します。これは真/偽として評価されます。


3
これがあれば例外がスローされますmyValueことを起こるnulltrueまたは他のいくつかのタイプ...
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);

(もちろん、古いブラウザーでは機能せず、Firefoxはfalseを示しますが、Opera、Chrome、Safari、IEはtrueを示します。バグ720760


10
他のコードと干渉することが心配な場合は、いつでも関数にプレフィックスを付けることができます。それでも壊れるコードがある場合、そのコードは非常に壊れやすく、修正する必要があります。追加した関数によってオブジェクトが重くなりすぎて、他のコードのパフォーマンスの問題が発生する場合は、明らかにその必要はありません。しかし、組み込みオブジェクトを拡張することは一般的に悪い考えではないと思います。また、それが事実である場合、それらは公的に拡張可能ではありません。
Shadow2531

41
@DTrejo @Szymon同意しない。これはまさに、プロトタイプをオーバーロードするためのものです。for..inに依存する(貧弱な)コードを壊すことを恐れている場合は、列挙からプロパティを非表示にする方法があります。を参照してくださいObject.defineProperty
devios1 2011

慣習に従うために私はそれを呼んでいますparseBool
guzart

8
ブール解析はStringクラスに属していません。最終的には、任意の量のごみパーサーと変換が行われます。-1は一般的にプロトタイプを変更します。-1は、ブラウザ間で機能しないソリューションに。デザインが悪い場合は-1。
トーマス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 2016年

1
「false」文字列をfalseブール値にキャストするのはどのくらい速いJSON.parseですか?CPU、メモリパフォーマンスの観点から
Green

if(str){...}から始めて、すでに間違っているものを取り除く方が簡単ではないでしょうか?そして、このif条件の中で、trueを返すことを心配する必要があります。
Larphoid

多くの文字列テストを(["true"、 "yes"、 "1"]。indexOf(str.toLowerCase()。trim())!= -1)に短縮して、 'null'などをカバーするBoolean(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()を追加します
Luis Lobo 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、 ''))); trueを生成します
エティエンヌ

3
getBool(undefined)元のJSONバージョンを使用するとクラッシュし、2番目のバージョンではtrueを返します。以下は、falseを返す3番目のバージョンです。function getBool(val){var num; return val!= null &&(!isNaN(num = + val)?!! num:!! String(val).toLowerCase()。replace(!! 0、 '')); }
ロンマルティネス

31

あなたの解決策は結構です。

===この場合、フィールドvalueは常にであるため、使用するのはばかげていStringます。


17
なぜあなたが使うのはばかげていると思います===か?パフォーマンスに関しては、両方のタイプが文字列の場合はまったく同じです。とにかく、私はむしろ使用し===、私はいつもの使用を避けるため、==!=。正当化:stackoverflow.com/questions/359494/...
マリアーノDesanze

3
以来value、常になりますstringどちら=====愚かです。どちらもこの仕事に適したツールです。タイプが等しくない場合のみ異なります。その場合、比較の前に複雑な型の強制アルゴリズムを実行しながらwhile が===単に戻ります。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

ブールオブジェクトには「解析」メソッドがありません。Boolean('false')trueを返すため、機能しません。!!'false'もを返すtrueため、これも機能しません。

string 'true'がブール値を返しtrue、string 'false'がブール値を返すようfalseにする場合、最も簡単な解決策はを使用することeval()です。eval('true')trueをeval('false')返し、false を返します。eval()ただし、使用する場合はパフォーマンスへの影響に注意してください。


evalの「間違っている」(または正しい)ものを理解するには、javascriptweblog.wordpress.com /
2010/04/19 / how

2
それvar isTrueSet = (myValue === 'true');が最良の答えだと思う。
thdoan 2013年

簡潔だといいですね。しかし、の基本的なケースでは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ウィジェットが返すのに十分な一般的な値です。
スノーマン2015

18

これは受け入れられた回答から取ったものですが、実際には非常に弱点があり、賛成票の数を取得する方法にショックを受けます。大文字と小文字が区別されるため、文字列の大文字と小文字を考慮する必要があるという問題があります。

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()を使用して、さらにクリーンにすることができます:-)
ティルダ

グローバルを変更しないでください。変更を分離してください。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")とブール値の両方をブール値に変換するには

('' + 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;
    });
}

これは、1つの例がブール値ではない場合に役立ちます。

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"

これは適切ですが、String型でのみ機能します。これが多分"true"またはである変数によって使用される必要があると想像してくださいtrue。2つ目が来ると、これは機能しません。document.prototypeこれを私たちが望む場所で使用することは可能ですか?
MarceloBarbosa

これはエレガントに見えます。よくやった!ただし、大きなJSアプリ(ユニットテストも必要)で基本的なプロトタイプをオーバーロードすると、予期しない動作が発生する可能性があることに気付きました(つまり、プロトタイプがオーバーロードされている配列を「for」で反復したい場合、通常は期待しないいくつかのプロパティ)。あなたは警告されました。;)
cassi.lup 2015年

ブール値も受け入れるyoursのバリアントfunction StringOrElse2Bool(sob){if(typeof sob === "string"){return ["no"、 "false"、 "0"、 "off"]。indexOf(sob.toLowerCase ())!== -1?真偽; } else {return !! sob}
bortunac

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 2012年

1
JavaScriptで文字列を比較する場合、変換を使用しない場合の==または===演算子の使用に違いはありません。ここでは文字列と比較しているため、型変換はありません。stackoverflow.com/questions/359494/…を
ars265

8

@ Shadow2531が言ったように、直接変換することはできません。また、コードが他の人によって再利用/使用される場合は、「真」と「偽」の他に、「真実」と「偽」の文字列入力を検討することをお勧めします。これは私が使用するものです:

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

選択の値とその値の表現を(考えて)分離する必要があります。

JavaScriptロジックで、文字列センチネルからネイティブタイプに遷移する必要があるポイントを選択し、そこで比較を行います。できれば、変換が必要な値ごとに1回だけ実行されるのが望ましい場所です。文字列センチネルがスクリプトが認識しないものである場合に何が必要かを忘れずに対処してください(つまり、デフォルトでtrueまたはfalseになっていますか?)

つまり、はい、文字列の値に依存する必要があります。:-)


7

この質問に対する私の見方は、それが3つの目的を満たすことを目的としているということです:

  • 真と偽の値の場合はtrue / falseを返しますが、文字列ではなくブール値の場合に真または偽となる複数の文字列値の場合もtrue / falseを返します。
  • 次に、指定された値以外の値が失敗しないように、復元力のあるインターフェイスを提供しますが、デフォルト値を返します
  • 3番目に、これらすべてを可能な限り少ないコードで実行します。

JSONを使用する場合の問題は、JavaScriptエラーが発生して失敗することです。このソリューションは弾力性がありません(ただし、1および3を満たします)。

JSON.parse("FALSE") // fails

このソリューションは十分に簡潔ではありません:

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

Typecast.jsのこの正確な問題の解決に取り組んでいます。そして、3つの目的すべてに対する最良の解決策はこれです。

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

多くの場合に機能し、{}などの値が渡されても失敗せず、非常に簡潔です。また、未定義またはエラーをスローするのではなく、デフォルト値としてfalseを返します。これは、緩やかに型付けされたJavascript開発でより役立ちます。それを示唆した他の答えへのブラボー!


目的に戻ると、3番目の最善のソリューションの唯一の問題は、目的#1を満たしていないこと'true'です。真の入力ではなく、の値に対してのみtrueを返します。Objective#1を満たすためには、Solution#2よりも少し簡潔であり、読みにくくなっています。
JMTyler 2013年

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

7

私は少し遅れましたが、これを実行するための小さなスニペットがあります。これは、本質的にすべてのJScriptの真偽/偽/ 不潔さを維持しますが、許容可能"false"偽の値として含みます。

サードパーティに依存せずにコードを解析するため、この方法を使用します(例: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と、boolのスキンを作成するその無数の方法が大好きです。

私がまだ見ていないことにショックを受けた私の好みは次のとおりです。

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.