JavaScript代码解释 - 三元运算符IF操作符前的波浪号符号

8
我正在查看Express中respons.js的代码,发现了以下代码:
res.contentType =
res.type = function(type){
  return this.set('Content-Type', ~type.indexOf('/')
    ? type
    : mime.lookup(type));
};

我的问题是,~运算符在type.indexOf()语句前面是做什么用的?它的目的是什么,何时使用?
2个回答

9

这是一个按位取反,虽然它在这里的使用非常不透明。

它被用来将indexOf-1结果(即未找到字符串)转换为0,这是一个假值(因为~-1 == 0,而0在布尔上下文中为假),并且它让所有其他值保持真值。

它本可以更清晰地写成(type.indexOf('/') != -1) ? ... : ...

用简单的语言来说,它表示:“将indexOf-1结果(即如果未找到/)视为false;否则,将结果视为true”。


3
实际上,~type.indexOf('/') 的意思是 "type 包含字符串 /"。 - Myrne Stol
1
为了提高可读性,您可以修补字符串原型:String.prototype.contains = function(s) { return ~this.indexOf(s); },这将使 type.contains('/') 成立。 - Eric
一个疑问,如果出现0而不是-1会发生什么?它是否总会命中0?那么,当将indexof的0结果转换为??时会发生什么? - Jeya Suriya Muthumari
1
@AgnesGruSteven 当 indexOf 返回 0 时,表示已找到匹配(在字符串的开头),因此您希望使用真值来指示匹配的存在。~0 等于 -1,这是一个真值。 - apsillers

0
波浪号是位运算符的非操作符,就像感叹号是逻辑非操作符一样。您可能想查看Mozilla开发者网络上该运算符的文档,以了解其完整用法和含义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接