在javascript中-1是真还是假?
当我使用indexOf时,我无法判断-1在javascript中是真是假在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 为什么最后两行给出的是真/假 据我所知,==允许进行类型转换,因为(==
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
。