javascript - 真偽値 - typescript 型変換




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

ブール値を表す文字列(例えば、 'true'、 'false')をJavaScriptの組み込み型に変換できますか?

私は、リスト内でのユーザーの選択に基づいて更新されるHTMLで隠されたフォームを持っています。 このフォームには、ブール値を表すいくつかのフィールドが含まれ、固有のブール値で動的に取り込まれます。 ただし、この値が非表示の入力フィールドに配置されると、文字列になります。

フィールドのブール値を決定するために、文字列に変換された唯一の方法は、文字列表現のリテラル値に依存することでした。

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

これを達成するより良い方法はありますか?


行う:

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

同一性演算子( === )ではなく、比較型変数の型が異なる場合に暗黙的な型変換を行わないアイデンティティ演算子( === )を使用すると、より厳密にすることができます。

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

しないでください:

特定のニーズにこれらの2つの方法使用することにはおそらく慎重でなければなりませ

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

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

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


警告

この高度にupvotedレガシー回答は技術的には正しいですが、文字列値が正確に"true"または"false" (小文字でもなければならない)である非常に特殊なシナリオだけをカバーします。

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

元の答え:

どうですか?

JSON.parse("true");

またはjQueryで

$.parseJSON("true");

@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とみなされfalse


Booleanオブジェクトには 'parse'メソッドがありません。 Boolean('false')はtrueを返します。これは機能しません。 !!'false'true返すので、それもうまくいきません。

ブール値falseを返すには、文字列'true'がブール値trueを返し、文字列'false'を返すようにするには、最も簡単な解決策はeval()を使用することです。 eval('true')はtrueを返し、 eval('false')はfalseを返します。 しかし、 eval()を使用するときのパフォーマンスの影響を覚えておいてください。


あなたが探している表現は簡単です

/^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

あなたの解決策は問題ありません。

===を使用すると、フィールドのvalueは常にStringなるので、この場合は愚かになります。


これは受け入れられた答えから取られていますが、実際には非常に弱点があります。そして、それがアップカウントの数をどのようにして得たのか、私はショックを受けました。文字列の大文字小文字を区別する必要があるため

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

すでに利用可能な回答がたくさんあります。 しかし、いくつかのシナリオでは、次のことが役立ちます。

// 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

もう一つの解決策。 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
> 

多くの回答があり、それを選ぶのは難しいです。 私の場合は、選択時にパフォーマンスを優先させるので、私はこのjsPerfを作成してここでいくつかの光を放つことができれば幸いです。

結果の概要(高い方が良い):

  1. 条件文 :2,826,922
  2. Boolオブジェクトのスイッチケース :2,825,469
  3. JSONへのキャスト :1,867,774
  4. !! コンバージョン数:805,322
  5. ストリングのプロトタイプ :713,637

彼らは、それぞれについてより多くの情報(賛否両論)を見つけることができる関連する回答にリンクしています。 特にコメントの中で。


文字列( "true"、 "false")とブール値の両方をbooleanに変換するには

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

どこにflagできますか

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

最も簡単な方法(文字列が 'true'または 'false'であることを前提とします)は次のとおりです。

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

これらのタイプの変換では、==演算子の代わりに常に ===演算子を使用してください。


正規表現を使用することができます:

/*
 * 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が真である間にFirefoxはfalseを表示します) Bug 720760


私はこの3つの目標を達成することを目標にしています。

  • 真偽値と偽値について真/偽を返しますが、文字列ではなくブール値であれば真偽である複数の文字列値に対して真偽を返します。
  • 次に、指定された値以外の値が失敗しないで、むしろデフォルト値を返すように復元力のあるインターフェイスを提供します
  • 第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をデフォルト値として返します。これはundefinedではなく、Errorをスローします。これは、疎結合のJavascript開発でより便利です。 それを示唆した他の答えにブラボー!


私はこれをうまくやるPHPのfilter_varにマッチする関数を書いた。 要点: https://gist.github.com/CMCDragonkai/7389368 : https://gist.github.com/CMCDragonkai/7389368

/**
 * Parses mixed type values into booleans. This is the same function as filter_var in PHP using boolean validation
 * @param  {Mixed}        value 
 * @param  {Boolean}      nullOnFailure = false
 * @return {Boolean|Null}
 */
var parseBooleanStyle = function(value, nullOnFailure = false){
    switch(value){
        case true:
        case 'true':
        case 1:
        case '1':
        case 'on':
        case 'yes':
            value = true;
            break;
        case false:
        case 'false':
        case 0:
        case '0':
        case 'off':
        case 'no':
            value = false;
            break;
        default:
            if(nullOnFailure){
                value = null;
            }else{
                value = false;
            }
            break;
    }
    return value;
};

私はこれを使用しています

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"

私は以下を使用します:

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

この関数は、文字列 "false"(大文字小文字を区別しない)と "0"を除いて、通常のブール型変換を実行します。


選択した値とその値の表記を(あなたの思考の中で)分離する必要があります。

文字列のセンチネルからネイティブ型への変換が必要なJavaScriptロジック内のポイントを選択し、そこで比較を行います。変換が必要な各値に対して1回だけ実行されるのが望ましいです。 文字列のセンチネルがスクリプトが知っているものでない場合(つまり、デフォルトを真か偽にするか)、何が起こる必要があるかを覚えておいてください。

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


function parseBool(value) {
    if (typeof value === "boolean") return value;

    if (typeof value === "number") {
        return value === 1 ? true : value === 0 ? false : undefined;
    }

    if (typeof value != "string") return undefined;

    return value.toLowerCase() === 'true' ? true : false;
}

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);
    }
}




javascript