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

时间:2016-06-24 13:49:10

标签: javascript

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

如果这被认为是“不良做法”,请告诉我。我将确保修改此和/或未来的帖子以显示更多背景信息。

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

在这种情况下,它后跟!= -1,我理解为"不等于-1和#34;。这对我来说很清楚。

我不完全理解的是第2行的实际回报最终是什么。它返回true或false的布尔值吗?或者它是否返回了实际指数,其中“'事件'找到了吗?

此外,在第一个if语句中,我们再次看到hasEvent变量。我将此语句读作"如果hasEvent(event,entry)为true,则将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;
}

感谢您的帮助,请告诉我是否应该以不同的方式陈述此问题!在我继续前进之前,我试图确保我理解事情!

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

是的。使用=====!!==!=>>=<或{ {1}}会产生一个布尔表达式,它会从<=返回一个布尔值。

答案 2 :(得分:1)

Comparison operators都计算为布尔值。

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

所以不要这样:

if (a == b) {

}

你可以拥有这个:

if (someCondition(a, b)) {

}

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

答案 3 :(得分:0)

说明

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

按位快捷方式可以与indexOf以及其他功能一起使用:

  • ~(按位而非运算符):
    • 这类似于~x => -(x+1)

仅对此值进行检查(例如使用if语句),对于非零值将生成true,对于零将生成false。

如果您需要实际的布尔值,则可以使用以下命令:!!~。在这里,双重感叹号!!是非反转的布尔表示。实质上,将两者结合会翻转indexOf的结果,然后将其转换为布尔表示形式。

可以here找到对~的更好解释。 here

!!有更好的解释

示例

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