我刚刚开始学习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;
}
感谢您的帮助,请告诉我是否应该以不同的方式陈述此问题!在我继续前进之前,我试图确保我理解事情!
答案 0 :(得分:6)
!=
运算符总是有一个布尔结果。
后跟表达式的return
语句返回表达式的值,因此该函数的返回值将为true
或false
。
答案 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
的结果,然后将其转换为布尔表示形式。
!!
有更好的解释
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