if语句中的boolean

Dir*_*kZz 129 javascript semantics

今天我已经对代码进行了评论,考虑了我在学校作业中检查变量是真还是假的方式.

我写的代码是这样的:

var booleanValue = true;

function someFunction(){
    if(booleanValue === true){
        return "something";
    }
}
Run Code Online (Sandbox Code Playgroud)

他们说像这样写它更好/更整洁:

var booleanValue = true;

function someFunction(){
    if(booleanValue){
        return "something";
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的关于"=== true"部分的评论是它不需要它并且可能造成混乱.

但我的想法是,最好检查变量是否是布尔值,特别是因为Javascript是一种loosetyped语言.

在第二个例子中,字符串也会返回"某物";

所以我的问题; 在将来松散"=== true"部分是否更为简洁,或者也是检查变量类型的好习惯.

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

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

jfr*_*d00 195

首先,事实:

if (booleanValue)
Run Code Online (Sandbox Code Playgroud)

将满足if任何truthy值的声明,booleanValue包括true任何非零数字,任何非空字符串值,任何对象或数组引用等...

另一方面:

if (booleanValue === true)
Run Code Online (Sandbox Code Playgroud)

这只会满足if条件,如果booleanValue完全相等true.没有其他真正的价值可以满足它.

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

if (someVar == true)
Run Code Online (Sandbox Code Playgroud)

然后,Javascript将做的是键入强制true以匹配类型,someVar然后比较两个变量.在很多情况下,这可能不是人们想要的.因此,在大多数情况下你想要避免,==因为有很长的规则关于Javascript如何强制将两个东西强制为相同类型,除非你理解所有这些规则并且可以预见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 
Run Code Online (Sandbox Code Playgroud)

对于该值2,您会认为这2是一个真正的值,因此它可以有利地比较true,但这不是类型强制的工作方式.它正在转换右手值以匹配左手值的类型,因此将其转换true为数字,1以便进行比较2 == 1,这肯定不是您可能想要的.

所以,买家要小心.==除非您明确知道要比较的类型并知道所有可能类型的强制算法如何工作,否则几乎在所有情况下都可能最好避免.


因此,它实际上取决于booleanValue您希望代码工作的预期值和方式.如果你事先知道它只有一个true或一个false值,那么明确地与它进行比较

if (booleanValue === true)
Run Code Online (Sandbox Code Playgroud)

只是额外的代码和不必要的

if (booleanValue)
Run Code Online (Sandbox Code Playgroud)

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

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

if (booleanValue === true)
Run Code Online (Sandbox Code Playgroud)

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


例如,如果你看一下.on()jQuery 中的实现,它有一个可选的返回值.如果回调返回false,则jQuery将自动停止事件的传播.在这种特定的情况下,由于jQuery的希望只能停止传播,如果false被退回,他们检查返回值显式=== false,因为他们不想undefined0""或其他任何东西,它会自动类型转换为假也满足比较.

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

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

if ( ret !== undefined ) {
     event.result = ret;
     if ( ret === false ) {
         event.preventDefault();
         event.stopPropagation();
     }
 }
Run Code Online (Sandbox Code Playgroud)

你可以看到jQuery正在寻找ret === false.

但是,jQuery代码中还有许多其他地方,根据代码的需要,更简单的检查是合适的.例如:

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

  • @Teemoh - 我明白你的意思了.答案已得到纠正和澄清,我添加了一个关于类型强制的部分,并举例说明了如何做出意想不到的事情. (2认同)

kar*_*una 37

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

如果你写:if(x),对于任何不是的x都是如此:''(空字符串),false,null,undefined,0,NaN.


Que*_*nUK 8

在简单的"if"中,变量将被强制转换为布尔值,并在对象上使用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.
Run Code Online (Sandbox Code Playgroud)

但是与===的比较没有任何类型的强制,所以它们必须是平等的而不是强制.

如果你说对象甚至可能不是布尔值,那么你可能不得不考虑不仅仅是真/假.

if(x===true){
...
} else if(x===false){
....
} else {
....
}
Run Code Online (Sandbox Code Playgroud)


Ven*_*Ven 5

这取决于你的用例.检查类型也是有意义的,但如果它只是一个标志,则不然.


SLa*_*aks 5

一般来说,省略=== true.

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

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

if (booleanValue === true)仅当booleanValue恰好等于时才会执行true