indexOf != -1返回一个布尔值吗?

Does indexOf != -1 return a Boolean?

本文关键字:一个 布尔值 返回 indexOf      更新时间:2023-09-26

我刚刚开始学习Javascript,我对下面的一段特定代码有一个特定的问题。它是雄辩Javascript第4章中狼人日志的一部分。由于我的问题的特殊性,我没有包括与此问题相关的所有其他代码,因为我认为没有必要回答我的问题。

如果这被认为是"不好的做法",请让我知道,我一定会修改这篇文章和/或以后的文章,以展示更多的背景。

在下面的代码中,第二行显示了一个返回。到目前为止,我已经了解到indexOf返回一个正数或零,当且仅当它发现任何传入它的事件。如果没有发现,返回-1。

在这种情况下,后面跟着!= -1,我理解它的意思是"不等于-1"。这对我来说很清楚。

我不完全理解的是第2行实际返回的结果是什么。它是否返回一个布尔值true或false?或者它是否返回找到'事件'的实际索引?

进一步,在第一个if语句中,我们再次看到hasEvent变量。我把这句话理解为"如果hasEvent(event, entry)为真,则在索引上加1。

我"读"这个正确吗?第二行返回确实是布尔值吗?

function hasEvent (event, entry) {
  return entry.events.indexOf(event) != -1;
}
function tableFor (event, journal) {
 var table = [0, 0, 0, 0];
 for (var i=0; i < journal.length; i++) {
  var entry = journal[i] , index = 0;
  if (hasEvent(event, entry)) index += 1;
  if (entry.squirrel) index += 2;
  table [index] += 1;
}
 return table;
}

谢谢你的帮助,请告诉我我是否应该把这个问题说得不同!在我继续前进之前,我想确保我理解了事情!

!=运算符总是有一个布尔值的结果。

return语句后跟表达式返回表达式的值,因此该函数的返回值将是truefalse

是的。使用===, ==, !, !==, !=, >, >=, <<=将产生一个布尔表达式,该表达式将返回一个来自hasEvent的布尔值。

比较运算符的值均为布尔值。

更重要的是,这段代码具体做的是在函数名后面抽象比较。任何产生某个值的操作或操作集都可以放在返回该值的函数中。这样做是一种常见的重构,以使代码更具可读性和可理解性,因为函数名可以赋予正在执行的操作直观的含义。

而不是像这样:

if (a == b) {
}

你可以这样写:

if (someCondition(a, b)) {
}

因此,您可以为操作提供一个有意义的名称(当然比someCondition更有意义)。只要该函数返回与其所替换的代码相同的值,逻辑上就没有区别。

说明

默认情况下,indexOf函数返回子字符串的索引位置。

位快捷键可以与indexOf以及其他函数一起使用:

  • ~ (bitwise not operator):
    • 工作原理类似于~x => -(x+1)

简单地检查这个值(例如使用if语句),非零值为true,零值为false。

如果需要实际的布尔值,可以使用以下命令:!!~。这里,双感叹号!!是非倒布尔表示。将两者结合起来,实际上是翻转indexOf的结果,然后将其转换为布尔表示。

~的更好解释可以在这里找到。!!的更好解释可以在这里找到

例子

let s = 'abc'
/*
console.log(~s.indexOf('a'))  // -1
console.log(~s.indexOf('b'))  // -2
console.log(~s.indexOf('d'))  //  0
console.log(!~s.indexOf('a')) // false
console.log(!~s.indexOf('b')) // false
console.log(!~s.indexOf('d')) // true
console.log(!!s.indexOf('a')) // false
console.log(!!s.indexOf('b')) // true
console.log(!!s.indexOf('d')) // true
console.log(~~s.indexOf('a')) // 0
console.log(~~s.indexOf('b')) // 1
console.log(~~s.indexOf('d')) // -1
*/
// This one works
console.log(!!~s.indexOf('a'))  // true: 0 => -1 => false => true
console.log(!!~s.indexOf('b'))  // true: 1 => -2 => false => true
console.log(!!~s.indexOf('d'))  // false: -1 => 0 => true => false