ජාවාස්ක්‍රිප්ට් හි නූලක් බූලියන් බවට පරිවර්තනය කරන්නේ කෙසේද?


2568

මට බූලියන් අගයක් නිරූපණය කරන නූලක් (උදා: 'සත්‍ය', 'අසත්‍ය') ජාවාස්ක්‍රිප්ට් හි සහජ වර්ගයක් බවට පරිවර්තනය කළ හැකිද?

මට HTML හි සැඟවුණු පෝරමයක් ඇත, එය ලැයිස්තුවක් තුළ පරිශීලකයෙකු තෝරා ගැනීම මත පදනම්ව යාවත්කාලීන වේ. මෙම පෝරමයේ බූලියන් අගයන් නිරූපණය කරන සහ අභ්‍යන්තර බූලියන් අගයකින් ගතිකව ජනගහනය වන සමහර ක්ෂේත්‍ර අඩංගු වේ. කෙසේ වෙතත්, මෙම අගය සැඟවුණු ආදාන ක්ෂේත්‍රයට ඇතුළත් කළ පසු එය නූලක් බවට පත්වේ.

ක්ෂේත්‍රයේ බූලියන් අගය තීරණය කිරීම සඳහා මට සොයාගත හැකි එකම ක්‍රමය, එය නූලක් බවට පරිවර්තනය කළ පසු, එහි නූල් නිරූපණයෙහි වචනාර්ථ වටිනාකම මත රඳා පවතී.

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

මෙය ඉටු කිරීමට වඩා හොඳ ක්‍රමයක් තිබේද?


51
"මෙය ඉටු කිරීමට වඩා හොඳ ක්‍රමයක් තිබේද?" - නිසැකවම වඩා නරක ක්‍රමයක් තිබේ: ඩීstring=(string==String(string?true:false))?(string?true:false):(!string?true:fa‌​lse);
මාර්ක් කේ කෝවන්

3
නූල් සහ බූල්ස් පහසුවෙන් හසුරුවන්න:function parseBool(val) { return val === true || val === "true" }
විකීනිලියම්ස්

2
Ark මාක්function checkBool(x) { if(x) {return true;} else {return false;} }
සෙබී

2
E සෙබී: ඔබට එය ලේඛනගත කිරීමට අමතක විය:if (checkBool(x) != false) { ... } else { ... }
මාර්ක් කේ කෝවන්

3
!!(parseInt(value) || value === "true")
ලූකා

Answers:


3504

කරන්න:

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

===සමානාත්මතා ක්‍රියාකරු ( ==) වෙනුවට සංසන්දනාත්මක විචල්‍යයන්ට විවිධ වර්ග ඇති විට කිසිදු ව්‍යංග වර්ග පරිවර්තනයක් සිදු නොකරන අනන්‍යතා ක්‍රියාකරු ( ) භාවිතා කිරීමෙන් ඔබට එය දැඩි කළ හැකිය .

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

එපා:

ඔබේ විශේෂිත අවශ්‍යතා සඳහා මෙම ක්‍රම දෙක භාවිතා කිරීම ගැන ඔබ බොහෝ විට සැලකිලිමත් විය යුතුය :

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

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

හිස් නූලක් නොවන ඕනෑම නූලක් ඒවා trueභාවිතා කිරීමෙන් ඇගයීමට ලක් කෙරේ . බූලියන් පරිවර්තනය සම්බන්ධයෙන් මට සිතිය හැකි පිරිසිදුම ක්‍රම ඒවා වුවද, මම හිතන්නේ ඒවා ඔබ සොයන දේ නොවේ.


197
myValue === 'true';හරියටම සමාන වේ myValue == 'true';. යොදා ගැනීමේ කිසිදු ප්රතිලාභ නැහැ ===කට ==මෙතන.
ටිම් ඩවුන්

556
මම ක්‍රොක්ෆර්ඩ්ගේ උපදෙස් හා භාවිතය අනුගමනය කරන ===අතර !==එය අර්ථවත් වන සෑම විටම පාහේ පවතී.
ගිනැප්ස්

55
උදාහරණයක් ලෙස සියලුම ලොකු අකුරුවල “සත්‍ය” ගැන කුමක් කිව හැකිද?
BMiner

102
@ ගිනැප්ස් මම සාමාන්‍යයෙන් ක්‍රොක්ෆර්ඩ්ගේ උපදෙස් පිළිපදින්නෙමි, නමුත් ==එදිරිව ===තත්වය. මා නොපැමිණෙන ස්වල්පයෙන් එකකි. එය "සෑම විටම පාහේ" භාවිතා කිරීම අර්ථවත් බව මම සම්පූර්ණයෙන්ම එකඟ නොවෙමි ===. ලිහිල් ලෙස ටයිප් කළ භාෂාවන් පවතින්නේ අපට වර්ගය ගැන සැලකිලිමත් වීමට අවශ්‍ය නැති නිසා ය; අපි යමක් පරික්ෂා if (price >= 50)කළහොත් එය නූලක් ලෙස ආරම්භ වූයේ නම් අපට කමක් නැත. මම කියන්නේ, බොහෝ විට, අපට අවශ්‍ය වන්නේ වර්ග ව්‍යාජ ලෙස හැසිරවීමයි. දුර්ලභ අවස්ථාවන්හිදී අපට ටයිප් ජගුලිං (උදා if (price === null)) අවශ්‍ය නොවේ නම් අපි භාවිතා කරමු ===. මෙය මම වසර ගණනාවක් තිස්සේ කර ඇති අතර මට කිසි විටෙකත් ගැටලුවක් නොවීය .
ජේඑම් ටයිලර්

170
@ ජේඑම් ටයිලර් නඩත්තු ක්‍රමලේඛකයා නොසලකා හැරිය හැක. සෑම විටම නිසි සංසන්දනාත්මක ක්‍රියාකරු භාවිතා කරන්න! ඔබ දෙපස ඇති වර්ග 'නිසැකවම' දන්නේ නම්, නමුත් === භාවිතා නොකරන්න, ඔබේ කේතය පසුව බලන විට මට එම දැනුම නැත. ඔබේ කේතය නැවත භාවිතා කරන්නේ නම් මෙය බියකරු සිහිනයක් බවට පත්විය හැකිය. ඔබ කියන පරිදි ඔබේ වර්ග 'ජගල්' කිරීමට ඔබට ඇත්ත වශයෙන්ම අවශ්‍ය නම්, '==' භාවිතා කරන්න, නමුත් බොහෝ ජේ.එස්. බූලියන් 'සත්‍ය' යන්නෙන් 'අසත්‍ය' යන වචන කොපමණ වාරයක් අවශ්‍යද?
aikeru

690

අවවාදයයි

මෙම ඉහළ උරුම උරුමය පිළිතුර තාක්‍ෂණිකව නිවැරදි නමුත් ආවරණය කරන්නේ ඔබේ සංගීත අගය හරියටම "true"හෝ "false".

පහත දැක්වෙන මෙම ශ්‍රිතයන් වෙත අවලංගු json නූලක් ව්‍යතිරේකයක් දමනු ඇත .


මුල් පිළිතුර:

කොහොමද?

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

හෝ jQuery සමඟ

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

63
මෙහි ඇති ගැටළුව නම් බොහෝ විභව අගයන් විග්‍රහ කිරීමේ දෝෂයක් ජනනය කරන අතර එය JS ක්‍රියාත්මක කිරීම නතර කරයි. එබැවින් JSON.parse ("FALSE") ධාවනය කිරීම ජාවාස්ක්‍රිප්ට් බෝම්බ කරයි. ප්රශ්නයේ කාරණය, මම සිතන්නේ, මෙම නිශ්චිත නඩු සරලව විසඳීම පමණක් නොව, වෙනත් අවස්ථාවන්ට ඔරොත්තු දීමේ හැකියාව ඇත.
බිෂොප් ඉසෙඩ්

3
Ule මෙම විසඳුම ඇත්ත වශයෙන්ම මට අවශ්‍ය දේමයි; හොඳයි, එය උත්සාහයෙන් ඔතා ... කෙසේ වෙතත් අල්ලා ගන්න. මට අවශ්‍ය වූයේ බූල් බවට පරිවර්තනය කිරීමට නම් එය නූල් වල බූලියන් අගයක් නම් පමණි; එසේ නොමැතිනම්, ලබා දී ඇති නූල භාවිතා කරන්න. මෙය ක්‍රියාත්මක වේ! ස්තූතියි.
jedmao

47
එය JSON.parse("TRUE".toLowerCase())නිවැරදිව විග්‍රහ කළ හැකි වන පරිදි පැවසීම ඉතා සරල ය .
යක්

27
ඇයි මෙතරම් උඩු යටිකුරු වන්නේ? මෙය අකාර්යක්ෂම හා භයානක ය. ඊළඟට කුමක් ද? 'true'.length === 4?
මැක්සිම් වී.

21
Aks මක්සිම්වි. 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;}
රොබට්

15
O රොබට්, හොඳයි, නමුත් ඒ වෙනුවට පෙරනිමිය මට තිබේ false.
drigoangelo

@drigoangelo තිබීම default: return true;නිසැකවම හැකි ය. නමුත් එය ශ්‍රිතයේ හැසිරීම වෙනස් කරයි.
රොබට්

2
මෙය හොඳම පිළිතුර යැයි මම සිතුවෙමි, මෙහි විස්තරාත්මකව විස්තර කිරීමට අවශ්‍ය විය: stackoverflow.com/questions/263965/…
BrDaHa

9
.toLowerCase () ඇමතීමෙන් ඔබ දත්ත සාමාන්‍යකරණය කරන්නේ නම්, එවිට ඔබට අවකාශය ඉවත් කිරීම සඳහා ටිම් () විසි කිරීමට අවශ්‍ය වනු ඇත
jCuga

175

මම හිතන්නේ මෙය බොහෝ විශ්වීය ය:

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'
අකුරකින්

String("what about input like this that isn't a bool?") == "true"
තෝමස් එඩින්ග්

6
H තෝමස් එඩින්ග් බොරු ... ඔබට එය නැවත ලබා දීමට අවශ්‍ය කුමක්ද?
ස්නෝබර්න්ට්

2
String()ඉදිකිරීම්කරු භාවිතා නොකිරීමෙන් කෙටි කළ හැකිය :true+'' === 'true' // true
ටොඩ්

1
BTW, 1 හෝ 0 සඳහා එය අසත්‍ය හෝ සත්‍ය සඳහා ද දැමිය යුතුය
මිගෙල්

129

නඩුව ගැලපීමට මතක තබා ගන්න:

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

එසේම, එය ආකෘති මූලද්‍රව්‍ය පිරික්සුම් කොටුවක් නම්, පිරික්සුම් කොටුව සලකුණු කර ඇත්දැයි ඔබට හඳුනාගත හැකිය:

var isTrueSet = document.myForm.IS_TRUE.checked;

එය පරික්ෂා කළ හොත් එය සත්‍යයට සමාන “සකසා” ඇතැයි උපකල්පනය කරන්න. මෙය සත්‍ය / අසත්‍ය ලෙස තක්සේරු කරයි.


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

සංගීත පන්තිය දීර් ing කිරීමට ඔබ කැමති නම් ඔබට කළ හැක්කේ:

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

alert("true".bool());

මෙය ලබා ගැනීම සඳහා සංගීත වස්තුව දිගු කිරීමට කැමති නමුත් ගණන් කළ නොහැකි බව ගැන කනස්සල්ලට පත්වන සහ සංගීත වස්තුව දිගු කරන වෙනත් කේත සමඟ ගැටීම ගැන කනස්සල්ලට පත්වන අය සඳහා (අදහස් බලන්න):

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

(ඇත්ත වශයෙන්ම පැරණි බ්‍රව්සර්වල වැඩ නොකරන අතර ෆයර්ෆොක්ස් අසත්‍ය බව පෙන්වන අතර ඔපෙරා, ක්‍රෝම්, සෆාරි සහ අයිඊ සත්‍ය බව පෙන්වයි. දෝෂ 720760 )


10
වෙනත් කේතයකට බාධා වේ යැයි ඔබ බිය වන්නේ නම් ඔබට සැමවිටම ශ්‍රිතය උපසර්ගය කළ හැකිය. සමහර කේත තවමත් කැඩී ඇත්නම්, එම කේතය ඉතා අස්ථාවර වන අතර එය නිවැරදි කළ යුතුය. ඔබ එකතු කළ ශ්‍රිතය වෙනත් කේත සඳහා කාර්ය සාධන ගැටලුවක් ඇති කරන තැන වස්තුව අධික ලෙස බර කරයි නම්, පැහැදිලිවම ඔබට එය කිරීමට අවශ්‍ය නැත. එහෙත්, සාමාන්‍යයෙන් ගොඩනඟන ලද වස්තූන් දිගු කිරීම නරක අදහසක් යැයි මම නොසිතමි. එය එසේ නම් ඒවා ප්‍රසිද්ධියේ දීර් extend කළ නොහැක.
ෂැඩෝ 2531

41
@DTrejo ySzymon මම එකඟ නොවෙමි. මූලාකෘතිය අධික ලෙස පැටවීම හරියටම මෙයයි. ..ඉන් මත රඳා පවතින (දුප්පත්) කේතය කැඩීමට ඔබ බිය වන්නේ නම්, ගණනය කිරීම් වලින් දේපල සැඟවීමට ක්‍රම තිබේ. බලන්න Object.defineProperty.
devios1

සම්මුතිය අනුගමනය කිරීම සඳහා මම එය අමතන්නෙමිparseBool
ගුසාර්ට්

8
බූලියන් විග්‍රහ කිරීම සංගීත පන්තියට අයත් නොවේ .. ඔබ අවසන් වනුයේ එහි කුණු කසළ හා පරිවර්තනයන් ය. -1 සාමාන්‍යයෙන් මූලාකෘති වෙනස් කිරීමට. හරස් බ්‍රව්සරයේ ක්‍රියා නොකරන විසඳුම් සඳහා -1. -1 දුර්වල නිර්මාණය සඳහා.
තෝමස් ඩබ්ලිව්

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 පොලිෆිල් එකක් අවශ්‍ය බව මතක තබා ගන්න.
ඩ්‍රෙහාල්

1
"ව්‍යාජ" නූලක් falseබූලියන් වටිනාකමට දැමීම කොතරම් වේගවත්ද JSON.parse? CPU අනුව, මතක ක්‍රියාකාරිත්වය
හරිත

(Str) with ... with සමඟ ආරම්භ කිරීම පහසු නොවන්නේ දැනටමත් අසත්‍ය කිසිවක් ඉවත් කිරීමට නොවේද? මෙම තත්වය තුළ නම්, සත්‍යය නැවත පැමිණීම ගැන කරදර විය යුතුය, මන්ද ඔබ දැනටමත් අවසන් වී ඇත්තේ අසත්‍යයෙනි!
ලාර්ෆොයිඩ්

(["සත්‍ය", "ඔව්", "1"] සමඟ ඔබට බොහෝ නූල් පරීක්ෂණ කෙටි කළ හැකි බව මතක තබා ගන්න. IndexOf (str.toLowerCase (). 'ශුන්‍ය' වැනි දේවල් ආවරණය කිරීම සඳහා බූලියන් (str)
ස්කොට්

38

ස්ටීවන්ගේ පිළිතුර හොඳම පිළිතුර යැයි මම සිතුවෙමි, එන අගය නිකම්ම නිකම් නූලකට වඩා බොහෝ අවස්ථා ගැන සැලකිලිමත් විය. මට එය ටිකක් දිගු කර පහත සඳහන් දෑ ඉදිරිපත් කිරීමට අවශ්‍ය විය:

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
මම ලෝවර් කේස් () ට පෙර .trim () එකතු කරමි
ලුයිස් ලොබෝ බොරෝබියා

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 (). ආදේශ කරන්න (!! 0, '')); සත්‍යය නිපදවයි
එටියන්

3
getBool(undefined)මුල් JSON අනුවාදය භාවිතා කරන විට බිඳ වැටෙනු ඇති අතර 2 වන අනුවාදය සඳහා සත්‍ය වේ. මෙන්න 3 වන අනුවාදය සාවද්‍ය ය: getBool (val) function var num; return val! = null && (! isNaN (num = + val)? !! num: !! string (val) .toLowerCase (). }
රොන් මාටිනස්

31

ඔබේ විසඳුම හොඳයි.

===ක්ෂේත්‍රය valueසැමවිටම a වන බැවින් භාවිතා කිරීම මෙම අවස්ථාවේ දී මෝඩ වනු ඇත String.


17
එය භාවිතා කිරීම මෝඩකමක් යැයි ඔබ සිතන්නේ ඇයි ===? කාර්ය සාධනය අනුව, වර්ග දෙකම නූල් නම් එය හරියටම සමාන වේ. කොහොම උනත්, මම ඒ වෙනුවට භාවිතා ===මම හැම විටම භාවිතය වළක්වා සිට ==හා !=. සාධාරණීකරණයන්: stackoverflow.com/questions/359494/…
Mariano Desanze

3
සිට valueසෑම විටම විය කැමැත්ත stringහෝ ==හෝ ===මෝඩ ය. දෙකම මෙම කාර්යය සඳහා නිවැරදි මෙවලම වේ. ඒවා වෙනස් වන්නේ වර්ග සමාන නොවන විට පමණි . සංසන්දනය කිරීමට පෙර සංකීර්ණ ආකාරයේ බලහත්කාර ඇල්ගොරිතමයක් ක්‍රියාත්මක කරන අතරතුර එවැනි අවස්ථාවකදී ===සරලව ආපසු පැමිණේ . false==
රොබට්

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')නැවත සත්‍ය වන බැවින් එය ක්‍රියාත්මක නොවේ. !!'false'එය ද නැවත ක්‍රියාත්මක trueවන බැවින් එය ද ක්‍රියා නොකරනු ඇත.

ඔබ string අවශ්ය නම් 'true'වීජ ආපසු trueසහ string 'false'ආපසු වීජ කිරීමට false, එවකට ඉතා සරළ විසඳුමක් භාවිතා කිරීමයි eval(). eval('true')සත්‍යය eval('false')වෙත ආපසු ගොස් අසත්‍යය ලබා දෙයි. භාවිතා කරන විට කාර්ය සාධනයේ ඇඟවුම් මතක තබා ගන්න eval().


එවාල් සමඟ "වැරදි" (හෝ හරි) කුමක්දැයි වටහා ගැනීම සඳහා - javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval වැනි ලිපි බලන්න හෝ 'ජාවාස්ක්‍රිප්ට් එවාල් අනිෂ්ට මෘදුකාංග' සඳහා ස්ටැක් ඕවර් ප්‍රවාහය සොයන්න
ග්‍රැහැම්එම්සී

2
var isTrueSet = (myValue === 'true');එය හොඳම පිළිතුර බව මම එකඟ වෙමි .
thdoan

මම කැමතියි එය සංක්ෂිප්තයි. එහෙත් එය මූලික සිද්ධිය සඳහා දර්ශනීය ලෙස අසමත් වේ eval('TRUE'); නැවත වරක් ඔප්පු කිරීම, eval()එය නපුරකි.
හිම මිනිසා

Rea ඒරියා 51 රහස් පරීක්ෂක ප්‍රබන්ධය එකම ආකාරයකින් JSON.parse('TRUE')පහත පිළිතුරෙන් ද දර්ශනීය ලෙස අසමත් වේ. ජාවාස්ක්‍රිප්ට් හි වැරදි තත්වයක් බල කිරීම පහසුය (හෝ ඕනෑම භාෂාවක්, ඒ සඳහා). මේ සඳහා ගණනය කිරීම සඳහා, ඔබ පළමුව var myValue = document.myForm.IS_TRUE.value.toLowerCase(); var isTrueSet = (myValue==='true' || myValue==='false') ? eval(myValue) : false;
නූල

1
B 10 බාසෙටම්: තරමක් නිවැරදි. ඔබ .toLowerCase()පිළිතුරට ඇතුළත් කළ යුත්තේ මගේ කාරණයයි. මම කිසිවක් බල කිරීමට උත්සාහ නොකරමි. ඉහළ කේස් TRUEයනු බොහෝ UI විජට් මඟින් ආපසු ලබා දීමට ප්‍රමාණවත් තරම් පොදු අගයකි.
හිම මිනිසා

18

මෙය පිළිගත් පිළිතුරෙන් ලබාගෙන ඇත, නමුත් ඇත්ත වශයෙන්ම එය ඉතා දුර්වල කරුණක් ඇති අතර, එය ඉහළ නැංවීම ගණනය කළ ආකාරය ගැන මම කම්පාවට පත් වෙමි.

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

සමාන නම් හෝ .toLowerCaseවිසි කළ හැකි බව සඳහන් නොකල යුතුයmyValuenullundefined
ඇන්ජලෝ ඔපාරා

16

මම පහත සඳහන් දෑ භාවිතා කරමි:

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

"ව්‍යාජ" (සිද්ධි සංවේදී නොවන) සහ "0" යන නූල් හැරුණු විට මෙම ශ්‍රිතය සුපුරුදු බූලියන් බලහත්කාරය සිදු කරයි.


16

පිළිතුරු ගොඩක් ඇති අතර එකක් තෝරා ගැනීම දුෂ්කර ය. මගේ නඩුවේදී, තෝරාගැනීමේදී මම කාර්ය සාධනයට ප්‍රමුඛතාවය දෙමි, එබැවින් මම මෙම jsPerf නිර්මාණය කරන්නේ මෙහි යම් ආලෝකයක් විසි කළ හැකි යැයි මම විශ්වාස කරමි.

ප්‍රති results ල කෙටියෙන් (වඩා හොඳ වඩා හොඳ):

  1. කොන්දේසි සහිත ප්රකාශය : 2,826,922
  2. බූල් වස්තුව මත නඩුව මාරු කරන්න : 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.toString () භාවිතා කළ හැකිය :-)
tillda

ගෝලීය වෙනස් නොකරන්න, ඔබේ වෙනස්කම් හුදකලා කිරීමට උත්සාහ කරන්න, function parseBooleanඒ වෙනුවට නව එකක් නිර්මාණය කරන්න
වානේ මොළය

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

නූල් දෙකම ("සත්‍ය", "අසත්‍ය") සහ බූලියන් බූලියන් බවට පරිවර්තනය කිරීම

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

නඩුව නොසලකා සත්‍ය හෝ අසත්‍යයට වඩා වෙනත් පා text යක් ලබා දුන් විට එය දෝෂයක් නැවත ලබා දෙන අතර එය සංඛ්‍යා ද ග්‍රහණය කරගනු ඇත

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

10

මෙම ශ්‍රිතයට නූල් මෙන්ම බූලියන් සත්‍ය / අසත්‍යය හැසිරවිය හැකිය.

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. දෙවැන්න පැමිණියහොත් මෙය ක්‍රියාත්මක නොවේ. හැකි සේ ය document.prototypeඅප එය අවශ්ය ඕනෑම තැනක මෙම භාවිතා කිරීමට?
මාර්සෙලෝබාර්බෝසා

මෙය අලංකාරයි. නියම වැඩක්! කෙසේ වෙතත්, විශාල JS යෙදුම්වල මූලික මූලාකෘති අධික ලෙස පැටවීම (ඒ සඳහා ඒකක පරීක්ෂණද අවශ්‍ය වේ) සමහර අනපේක්ෂිත හැසිරීම් වලට හේතු විය හැකි බව මම දුටුවෙමි (එනම්, මූලාකෘති අධික ලෙස පටවා ඇති අරාවක් හරහා “සඳහා” සමඟ නැවත යෙදීමට ඔබට අවශ්‍ය වූ විට, ඔබට ලැබෙනු ඇත ඔබ සාමාන්‍යයෙන් අපේක්ෂා නොකරන සමහර ගුණාංග). ඔබට අනතුරු අඟවා ඇත. ;)
cassi.lup

බූලියන් ද පිළිගන්නා ඔබගේ ප්‍රභේදයක් වන StringOrElse2Bool (sob) {if (typeof sob === "string") {ආපසු ["නැත", "අසත්‍ය", "0", "අක්‍රිය"]. indexOf (sob.toLowerCase ())! == -1? අසත්ය: ඇත්ත; } else {ආපසු !!
sob

8

පහසුම ක්‍රමයට අත තබන්න (ඔබේ වචන 'සත්‍ය' හෝ 'අසත්‍ය' යැයි උපකල්පනය කරයි):

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 කීවාක් මෙන්, ඔබට එය කෙලින්ම පරිවර්තනය කළ නොහැක. ඔබේ කේතය වෙනත් අය විසින් නැවත භාවිතා කිරීමට / භාවිතා කිරීමට යන්නේ නම් “සත්‍ය” සහ “අසත්‍යය” හැරුණු විට “සත්‍ය” සහ “අසත්‍ය” යන වචන ආදාන සලකා බැලිය යුතු යැයි මම යෝජනා කරමි. මම භාවිතා කරන්නේ මෙයයි:

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

ඔබේ තේරීම්වල වටිනාකම සහ එම අගය නිරූපණය කිරීම (ඔබේ චින්තනයේ දී) වෙන් කළ යුතුය.

ජාවාස්ක්‍රිප්ට් තර්කනයේ ලක්ෂ්‍යයක් තෝරන්න, එහිදී ඔවුන්ට නූල් සෙන්ඩිනල්වල සිට ස්වදේශීය වර්ගයට මාරුවීමට අවශ්‍ය වන අතර එහි සැසඳීමක් කරන්න. සෙන්ටිනල් නූල ස්ක්‍රිප්ට් එකක් නොදන්නේ නම් සිදුවිය යුතු දේ ආමන්ත්‍රණය කිරීමට මතක තබා ගන්න (එනම් ඔබ පෙරනිමි සත්‍ය හෝ අසත්‍යද?)

වෙනත් වචන වලින් කිවහොත්, ඔව්, ඔබ නූල් වල වටිනාකම මත රඳා සිටිය යුතුය. :-)


7

මෙම ප්‍රශ්නය මා විසින් ගනු ලබන්නේ අරමුණු තුනක් සපුරාලීම අරමුණු කර ගෙන ය:

  • සත්‍ය සහ අසත්‍ය අගයන් සඳහා සත්‍ය / අසත්‍යය ආපසු එවන්න, නමුත් නූල් වෙනුවට බූලියන් නම් සත්‍ය හෝ අසත්‍ය විය හැකි බහු නූල් අගයන් සඳහා සත්‍ය / අසත්‍යය ආපසු එවන්න.
  • දෙවනුව, නිශ්චිත අගයන් හැර වෙනත් අගයන් අසමත් නොවී පෙරනිමි අගයක් ලබා දෙන පරිදි ඔරොත්තු දෙන අතුරු මුහුණතක් සපයන්න
  • තෙවනුව, මේ සියල්ල හැකි තරම් කුඩා කේතයකින් කරන්න.

JSON භාවිතා කිරීමේ ගැටළුව වන්නේ එය ජාවාස්ක්‍රිප්ට් දෝෂයක් ඇතිවීමෙන් අසමත් වීමයි. මෙම විසඳුම ඔරොත්තු නොදේ (එය 1 සහ 3 තෘප්තිමත් වුවද):

JSON.parse("FALSE") // fails

මෙම විසඳුම ප්රමාණවත් නොවේ:

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

Typecast.js සඳහා මෙම නිශ්චිත ගැටළුව විසඳීමට මම කටයුතු කරමින් සිටිමි . අරමුණු තුනටම හොඳම විසඳුම මෙයයි:

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

එය බොහෝ අවස්ථාවන් සඳහා ක්‍රියා කරයි, {like වැනි අගයන් සම්මත වූ විට අසමත් නොවේ, ඉතා සංක්ෂිප්ත ය. ලිහිල්ව ටයිප් කළ ජාවාස්ක්‍රිප්ට් සංවර්ධනය සඳහා වඩාත් ප්‍රයෝජනවත් වන දෝෂයක් නිර්වචනය කිරීමට හෝ දෝෂයක් විසි කිරීමට වඩා එය පෙරනිමි අගය ලෙස අසත්‍ය වේ. එය යෝජනා කළ අනෙක් පිළිතුරු වලට බ්‍රාවෝ!


ඔබේ අරමුණු වෙත ආපසු යාම සඳහා, ඔබේ තුන්වන සහ හොඳම විසඳුම සමඟ ඇති එකම ගැටළුව එය # 1 පරමාර්ථය සපුරාලීම නොවේ - එය සත්‍යයක් බවට 'true'පත්වන්නේ වටිනාකමක් සඳහා මිස කිසිදු සත්‍ය ආදානයකට නොවේ. එය # 1 පරමාර්ථය සපුරාලීම සඳහා, එය විසඳුම # 2 ට වඩා මදක් සංක්ෂිප්ත වන අතර කියවිය හැකි තරම් අඩුය.
ජේඑම් ටයිලර්

return /^(true|yes|1|t|y)$/i.test(str);
කෙවින් බූචර්

7

මම ටිකක් පරක්කුයි, නමුත් මට මෙය කිරීමට කුඩා ස්නිපටයක් ඇත, එය අත්‍යවශ්‍යයෙන්ම සියලුම JScripts truthey / falsey / අපිරිසිදු ලෙස නඩත්තු කරයි නමුත් "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

ශුද්ධ වූ දෙවියනේ මෙම පිළිතුරු සමහරක් වල් ය. මම ජේඑස් සහ එහි අසීමිත ක්‍රමයට ආදරය කරමි.

දැනටමත් දැක නොගැනීම ගැන මම කම්පනයට පත් වූ මගේ මනාපය:

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

6

එක් ලයිනර්

වෙනත් ඕනෑම නූලක් ("සත්‍ය" ඇතුළුව) දැනටමත් ඇති බැවින් අපට "ව්‍යාජ" නූල සඳහා ගණන් දිය යුතුය 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.