Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中-1是真还是假?_Javascript_Boolean_Truthiness - Fatal编程技术网

在javascript中-1是真还是假?

在javascript中-1是真还是假?,javascript,boolean,truthiness,Javascript,Boolean,Truthiness,当我使用indexOf时,我无法判断-1在javascript中是真是假 let a = 'abc'.indexOf('abc'); let b = 'def'.indexOf('abc'); console.log(a); // 0 console.log(b); // -1 console.log(!a); // true console.log(!b); // false 为什么最后两行给出的是真/假 据我所知,==允许进行类型转换,因为(==

当我使用indexOf时,我无法判断-1在javascript中是真是假

let a =  'abc'.indexOf('abc');  
let b =  'def'.indexOf('abc');   

console.log(a);     // 0
console.log(b);     // -1
console.log(!a);    // true
console.log(!b);    // false
为什么最后两行给出的是真/假

据我所知,==允许进行类型转换,因为(==是严格的)

(!a)和(!b)是否在内部某处使用(=)

在JavaScript中,truthy值是在布尔上下文中计算时转换为true的值除非定义为falsy(即,除false、0、“、null、未定义和NaN外),否则所有值都是真实的。(强调)


这意味着
-1
被认为是“真实的”。无论如何,您不应该直接在
indexOf
返回的值上检查“真实性”
-1
有一个特定的含义,即您要查找的元素在数组中不存在。因此,使用
=
显式测试
-1
更有意义。对于任何阅读代码的人来说,其意图也比强制执行
indexOf的返回值并据此做出决定要清楚得多。

要检查哪些变量转换为布尔值,最好的技巧是使用布尔运算符。例如
(否定)是一个布尔运算符,它为该值提供否定(
true
表示
false
,反之亦然)

这些知识在Javascript(以及PHP和Python)中使用如下:

var booleanValue = !!someVariable;
你的情况就是这样:

!!(-1) //returns true
因此,是的,
-1
将通过隐式javascript转换转换为true。

在javascript中,只有“0”是false。当使用前面的“!”进行调用时,javascript会将所有内容转换为布尔值。 另一个有趣的事实:

console.log(!!!a);    // false
console.log(!!!b);    // true

因此,用!!求逆值

-1
是一个类似于trule的值。JavaScript中数字之间唯一类似于
false
的值是
0
。其他
false
-类似值为
'
NaN
未定义
。。。我希望我没有错过任何东西

当使用indexOf时,您需要做的就是

if (someString.indexOf('value') >= -1) {
    //code if someString contains 'value'
}

这是真的。唯一的“假”数字是零。你需要测试它
=-1
是否为真。这两者都不是,它是一个数字,不是布尔值,但是它是真的。它都是从c开始的,其中0为假,其他所有的都是真的。JavaScript试图遵循这一点,但在没有严格的类型强制的情况下很快就变得混乱了。除了可读性之外,直接将(!)与indexOf一起使用还有什么问题吗?如果找不到值,则始终返回-1(truthy),这会使最终结果为false。那么为什么要使用更长的.indexOf('string')>-1更长的语法说明了您实际在做什么(即在数组中查找元素的索引)。有效索引的范围从0到长度-1。因此,它比将值强制为布尔值更直观。强制和测试无论如何都不是很有用,因为除了
0
,其他每个索引都是“truthy”,而您真正关心的唯一值是
-1
,它恰好也是truthy。因此,您必须执行类似于
arr.indexOf(i)&&arr.indexOf(i)>-1的操作,以查看是否有有效的索引。那么,为什么不干脆执行
arr.indexOf(i)>-1
呢?只需对上面的评论稍加修改即可。完整表达式将是
(arr.indexOf(i)&&arr.indexOf(i)!=-1)|!arr.indexOf(i)
,这比只检查
arr.indexOf(i)!=-1