2017-08-16 176 views
1

以下是一些代码:Infinity Loop Slider Concepts,存在布尔语句,返回true或false,并再次将其转换为带有双运算符(!)的布尔值,代码行:将返回的布尔值转换为布尔值

cycle = !!(current === 0 || current > len); 

所以a'm很有趣为什么autor使用!!(// code),正如我所知!将该值转换为逻辑真/假,但代码已经返回布尔值(当前=== 0 ||当前> len)//真/假。 请解释或(!!)是不必要的?

+1

这里不需要'!!'。您可能想评论该帖子并询问。 – georg

+0

谢谢,这是一个足够老的问题,所以我认为作者不会回答,我创建了一个新的问题 – Alex

回答

0

===返回布尔值,表示current === 0返回布尔值,>返回布尔值,表示current > len返回布尔值,表示current === 0 || current > len返回布尔值。将其重新转换为布尔值是绝对多余的。

0

它没有在这个例子中的任何意义,因为条件可以只是truthy或falsy

与否定之否定你逼“周期”为“truthyfalsy”值

可以说,在运行此代码

if (variable.guess) { 
    // would be executed if variable.guess containts a not falsy value 
} 

,这并不意味着

variable.guess === true 
+0

谢谢,如果我将使用!!(variable.guess),(variable.guess === true)将是真实的。 (!!)不是必须的,如果我们有布尔类型? – Alex

+0

你的第一句话似乎与这个答案的其余部分相矛盾,或者你很难说出你想说的话。 – deceze

+0

这是正确的。如果它像'!!(current || somethingElse)'那样需要,因为技术上||作为一个操作符返回其中的任意一个参数,这意味着不是严格的布尔值。 – vassiliskrikonis

-1

||运营商的行为,像这样:

a || b // returns a if a is truthy 
a || b // returns b if a is falsy 

这就是为什么你看到它用来设置默认值

var foo = bar || 'something'; // if bar is falsy (like undefined) the operator returns 'something' 

正如在以前的答案都current === 0current > len提到的是布尔类型因此(通常用于将值转换为纯布尔类型)在此处没有值,因为Boolean || Boolean已经返回布尔值。

虽然有问题的代码是错误的或不必要的(在我看来是错误的),但这并不意味着它在Javascript中不是一个棘手的部分。

通常你在Javascript想要的是得到强制转换为布尔类型,但让我们说,你绝对需要一个布尔值,你有下面的代码:

var result = current || current > 5 

如果current === 'foo'然后result === 'foo'

什么如果你在做与result东西在代码 后来像:

finalResult = result + 1

如果result === 'foo'那么finalResult === 'foo1'但是如果result === false然后finalResult === 1

这些时候你只是希望你使用静态类型语言。

实际上,所有你需要的Javascript都是类型强制转换,并且只有在将字符串与变量连接起来时才会关心这些奇怪的事情。