javascript用法 - javascript保留




如何在JavaScript中將字符串轉換為布爾值? (20)

做:

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

您可以通過使用身份運算符( === )使其更嚴格,當比較變量具有不同類型時,不會進行任何隱式類型轉換,而不是等號運算符( == )。

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

別:

您應該謹慎使用這兩種方法來滿足您的特定需求:

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

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

任何不是空字符串的字符串都將通過使用它們評估為true 。 儘管它們是我可以想到的關於布爾轉換的最乾淨的方法,但我認為它們不是您想要的。

我可以將代表布爾值的字符串(例如'true','false')轉換為JavaScript中的內部類型嗎?

我在HTML中有一個隱藏表單,根據用戶在列表中的選擇進行更新。 這個表單包含一些表示布爾值的字段,並用一個固有的布爾值動態填充。 但是,一旦將此值放入隱藏的輸入字段中,它就會變成一個字符串。

一旦將字段轉換為字符串,我可以發現確定字段布爾值的唯一方法是依賴於字符串表示形式的字面值。

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

有沒有更好的方法來實現這一點?


警告

這個高度贊同的遺留答案在技術上是正確的,但只包含一個非常具體的場景,當你的字符串值完全是"true""false" (必須是小寫)。

傳遞給下面這些函數的無效json字符串將會拋出異常

原始答案:

怎麼樣?

JSON.parse("true");

或與jQuery

$.parseJSON("true");

你可以使用正則表達式:

/*
 * 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對象的其他代碼衝突的人(請參閱註釋):

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

(當然,舊版瀏覽器無法正常工作,Firefox顯示錯誤,而Opera,Chrome,Safari和IE顯示為真。 錯誤720760


你正在尋找的表達只是

/^true$/i.test(myValue)

如在

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

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

你需要分離(在你的思維中)你選擇的價值和價值的表示。

在JavaScript邏輯中選擇一個點,它們需要從字符串標記轉換為本地類型,然後在那裡進行比較,最好是只對每個需要轉換的值完成一次。 請記住,如果字符串標記不是腳本知道的(即,您是否默認為true或false),那麼需要解決什麼問題?

換句話說,是的,你需要依賴字符串的值。 :-)


另一種方案 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
> 

就像@ 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;
  }
}

已經有很多答案可用。 但在以下情況下可能會有用。

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

我使用以下內容:

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

除了字符串“false”(不區分大小寫)和“0”以外,該函數執行通常的布爾強制轉換。


我寫了一個函數來匹配PHP的filter_var,這很好地做到了。 要點如下: https://gist.github.com/CMCDragonkai/7389368https://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"

我發現使用'1'和一個空值''作為布爾值的工作遠比'true'或'false'字符串值更具可預測性...特別是對於html表單,因為Dom元素中的未初始化/空值將始終如一地進行評估為假,而其中的任何值評估為真。

例如:

<input type='button' onclick='this.value = tog(this.value);' />

<script type="text/javascript">

    function tog(off) {
        if(off) {
            alert('true, toggle to false');
            return '';
        } else {
            alert('false, toggle to true');
            return '1';
        }
    }   
</script>

就像是一條更簡單的道路,到目前為止它一直很容易......也許有人可以確定一種方法來打破這種情況?


我認為這個問題是為了實現三個目標:

  • 對於真值和偽值,返回真/假,但對於多個字符串值,如果它們是布爾值而不是字符串,則會返回真/假。
  • 其次,提供一個彈性接口,以便除了指定的值以外的值不會失敗,而是返回一個默認值
  • 第三,盡可能使用盡可能少的代碼來完成這一切。

使用JSON的問題是,它導致Javascript錯誤失敗。 該解決方案不具有彈性(儘管滿足1和3):

JSON.parse("FALSE") // fails

這個解決方案不夠簡潔:

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

我正在為Typecast.js解決這個確切的問題。 這三個目標的最佳解決方案是:

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

它適用於很多情況,在傳入{}等值時不會失敗,並且非常簡潔。 此外,它返回false作為默認值而不是未定義或拋出一個錯誤,這在鬆散類型的Javascript開發中更為有用。 布拉沃到其他建議它的答案!


我認為這非常普遍:

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

它是:

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

有很多答案,很難選擇一個答案。 就我而言,我在選擇時優先考慮性能,所以我創建了這個jsPerf ,我希望能夠在這裡拋出一些光。

結果簡述(越高越好):

  1. 條件聲明 :2,826,922
  2. 在Bool對像上切換案例 :2,825,469
  3. 投向JSON :1,867,774
  4. 轉換次數 :805,322
  5. 字符串原型 :713,637

它們與相關的答案相關,你可以找到關於每個答案的更多信息(優缺點); 特別是在評論中。


木眼要小心。 在應用500+ upvotes的最佳答案後,我看到後果後,我覺得有義務發布一些實際有用的東西:

讓我們從最短但非常嚴格的方式開始:

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

這是從公認的答案中得出的,但實際上它有一個非常薄弱的​​地方,我很震驚它是如何得到upvotes的數量,它的問題是你必須考慮字符串的情況,因為這是區分大小寫的

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

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

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