这是一些代码:Infinity Loop Slider Concepts,有布尔语句,返回true或false,然后再用双运算符(!)将其转换为boolean,代码行:
QQuickView
所以有趣的是为什么autor使用!!(//代码),因为我知道!! сonverts值为逻辑真/假,但代码已经返回布尔值(当前=== 0 ||当前> len)//真/假。 请解释或(!!)是不必要的?
答案 0 :(得分:0)
在这个例子中没有任何意义,因为条件可能只是真实或虚假
通过双重否定,您将“周期”强制为“this aswer或truthy”值
假设您运行此代码
if (variable.guess) {
// would be executed if variable.guess containts a not falsy value
}
这并不意味着
variable.guess === true
答案 1 :(得分:0)
===
返回一个布尔值,这意味着current === 0
返回一个布尔值,>
返回一个布尔值,这意味着current > len
返回一个布尔值,这意味着current === 0 || current > len
返回一个布尔值。再将它转换为布尔值绝对是多余的。
答案 2 :(得分:-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 === 0
和current > 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中所需要的只是类型强制,只有在用变量连接字符串时才会关心这些特殊的事情。