在if语句中的布尔值

2020/11/13 05:23 · javascript ·  · 0评论

今天,我考虑到我在学校作业中检查变量是对还是错的方式,对代码进行了评论。

我写的代码是这样的:

var booleanValue = true;

function someFunction(){
    if(booleanValue === true){
        return "something";
    }
}

他们说最好这样写:

var booleanValue = true;

function someFunction(){
    if(booleanValue){
        return "something";
    }
}

我对“ === true”部分的评论是,不需要它,可能会造成混乱。

但是我的想法是,最好检查变量是否为布尔值,尤其是因为Javascript是一种松散类型的语言。

在第二个示例中,字符串也将返回“ something”。

所以我的问题;将来松散“ === true”部分是否更整洁,还是检查变量类型的好习惯?

编辑:
在我的“真实”代码中,布尔值表示图像是否已删除,因此boolValue唯一应具有的值是true或false。

例如,0和1不应在该变量中。

首先,事实:

if (booleanValue)

if对于任何真实值(booleanValue包括true,任何非零数字,任何非空字符串值,任何对象或数组引用等),将满足该语句

另一方面:

if (booleanValue === true)

if如果booleanValue正好等于,这将满足条件true没有其他真实的价值可以满足它。

另一方面,如果您这样做:

if (someVar == true)

然后,Javascript将要做的是强制键入类型true以匹配的类型,someVar然后比较两个变量。在很多情况下,这可能不是人们想要的。因此,在大多数情况下,您要避免使用,==因为关于Java语言如何强制将两种类型的内容强制转换为相同类型的规则相当长,除非您了解所有这些规则并且可以预期JS解释器在何时执行的所有操作给定两种不同的类型(大多数JS开发人员无法做到),您可能希望==完全避免

作为一个令人困惑的例子:

var x;

x = 0;
console.log(x == true);   // false, as expected
console.log(x == false);  // true as expected

x = 1;
console.log(x == true);   // true, as expected
console.log(x == false);  // false as expected

x = 2;
console.log(x == true);   // false, ??
console.log(x == false);  // false 

对于值2,您会认为这2是一个真实值,因此可以与相比true,这是正确的,但这不是类型强制的工作原理。它正在转换右手值以匹配左手值的类型,因此将其转换true为数字,1以便进行比较2 == 1,这肯定不是您想要的。

因此,买家要当心。==除非您明确知道要比较的类型,并且知道所有可能的类型强制算法如何工作,否则最好避免在几乎所有情况下使用。


因此,它实际上取决于期望值booleanValue以及您希望代码如何工作。如果您事先知道它只会有一个trueorfalse值,那么可以将其与

if (booleanValue === true)

只是多余的代码,是不必要的,

if (booleanValue)

更紧凑,可以说更清洁/更好。

另一方面,如果您不知道booleanValue可能是什么,并且想要测试它是否真的设置为true不允许其他自动类型转换,那么

if (booleanValue === true)

不仅是一个好主意,而且是必需的。


例如,如果您查看.on()jQuery中的实现,则它具有可选的返回值。如果回调返回false,则jQuery将自动停止事件的传播。在这种特定情况下,由于jQuery只希望停止false返回时的传播,因此他们明确检查返回值,=== false因为他们不希望undefinedor0""or或其他任何将自动类型转换为false的内容也可以满足比较。

例如,这是jQuery事件处理回调代码:

ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );

if ( ret !== undefined ) {
     event.result = ret;
     if ( ret === false ) {
         event.preventDefault();
         event.stopPropagation();
     }
 }

您可以看到jQuery正在明确寻找ret === false

但是,考虑到代码的需求,jQuery代码中还有许多其他地方需要进行更简单的检查。例如:

// The DOM ready check for Internet Explorer
function doScrollCheck() {
    if ( jQuery.isReady ) {
        return;
    }
    ...

如果您写:if(x === true),则只有x = true才成立

如果您写:if(x),则对于任何非x都为true ”(空字符串),false,null,undefined,0,NaN。

在简单的“如果”中,变量将强制为布尔值,并且在对象上使用toBoolean:

    Argument Type   Result

    Undefined       false
    Null            false
    Boolean         The result equals the input argument (no conversion).
    Number          The result is false if the argument is +0, −0, or NaN;
                    otherwise the result is true.
    String          The result is false if the argument is the empty 
                    String (its length is zero); otherwise the result is true.
    Object          true.

但是与===的比较没有任何类型强制性,因此它们必须相等而没有强制性。

如果您说该对象甚至可能不是布尔值,那么您可能不仅要考虑true / false。

if(x===true){
...
} else if(x===false){
....
} else {
....
}

这取决于您的用例。检查类型也可能有意义,但是如果只是一个标志,则不是。

通常,省略会更干净,更简单=== true

但是,在Javascript中,这些语句是不同的。

if (booleanValue)如果将执行booleanValuetruthy -比其他任何东西0false''NaNnull,和undefined

if (booleanValue === true)仅在booleanValue精确等于时执行true

身份(===)运算符的行为与相等(==)运算符的行为相同,只是不进行类型转换,并且类型必须相同才能被视为相等。

由于检查的值是Boolean首选,因此最好直接使用它以减少编码,并且完全相同==true

由于您已经清楚地将其初始化为bool,因此我认为===不需要运算符。

如果变量只能采用布尔值,那么使用较短的语法是合理的。

如果它可能被分配其他类型,并且需要区分true来自1或者"foo",则必须使用=== true

我认为您的推理是正确的。但实际上,我发现省略===比较是很常见的我认为有以下三个原因:

  1. 它通常不会增加表达式的含义-在已知该值仍然是布尔值的情况下。
  2. 由于JavaScript中存在大量类型不确定性,因此当您获得意外undefinednull有价值的信息时,强制进行类型检查会咬住您在这种情况下,通常您只是希望测试失败。(尽管我试图用“快速失败”的座右铭来平衡这一观点)。
  3. JavaScript程序员喜欢使用类型来快速操作,特别是在布尔表达式中,因为我们可以。

考虑以下示例:

var someString = getInput();
var normalized = someString && trim(someString);  
// trim() removes leading and trailing whitespace

if (normalized) {
    submitInput(normalized);
}

我认为这种代码并不罕见。它处理情况getInput()回报undefinednull或一个空字符串。由于有两个布尔值,submitInput()因此仅当给定输入是包含非空格字符的字符串时才调用布尔求值

在JavaScript中,&&如果第一个参数为假,则返回其第一个参数;如果第一个参数为真,则返回第二个参数;所以normalizedundefined,如果someString是不确定的,等等。这意味着上述布尔表达式的输入实际上都不是布尔值。

我知道很多程序员在看到这样的代码时习惯于强大的类型检查能力。但是请注意,应用强类型键入可能需要显式检查nullundefined值,这会使代码混乱。在JavaScript中不需要。

这取决于。如果您担心变量最终可能会变成TRUE。然后必须进行严格检查。否则由您决定。但是,我怀疑该语法whatever == TRUE是否会混淆任何知道自己在做什么的人。

在Javascript中,布尔值的概念很模糊。考虑一下:

 var bool = 0 
 if(bool){..} //evaluates to false

 if(//uninitialized var) //evaluates to false

因此,当您使用if语句(或任何其他控制语句)时,不必使用“布尔”类型var。因此,我认为,如果您知道语句是布尔值,则语句的“ === true”部分是不必要的,但是如果您的值是模棱两可的“真实”变量,则绝对必要。可以在javscript中找到有关布尔的更多信息

Revisa https://www.w3schools.com/js/js_comparisons.asp

例:

var p=5;

p==5 ? true
p=="5" ?  true
p==="5" ? false

===表示相同的类型也等​​于相同的值==只是相同的值

在此处输入图片说明

如果需要测试对象,也可以使用布尔对象进行测试
error={Boolean(errors.email)}

本文地址:http://javascript.askforanswer.com/zaiifyujuzhongdebuerzhi.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!