~indexof()能判断存在是因为按位非将-1转为0(falsy),其余索引转为非零值(truthy);常用于字符串/数组存在性判断,但可读性差,推荐用includes()替代。

按位非运算符(~)配合 indexOf() 是一种简洁判断字符串或数组中元素是否存在的写法,核心在于利用 ~ 对 indexOf() 返回值做转换:把 -1 变成 0(falsy),其他非负索引变成非零值(truthy)。
为什么 ~indexOf() 能判断存在?
indexOf() 找不到时返回 -1;找到时返回首个匹配位置(0 或正整数)。而按位非运算符 ~x 等价于 -(x + 1):
-
~(-1)→-(-1 + 1)→0(falsy) -
~0→-1(truthy) -
~1→-2(truthy) -
~2→-3(truthy)
所以 if (~arr.indexOf(x)) 或 if (~str.indexOf('a')) 中,只有查不到时结果为 0(进入 else),其余都为真值,可直接用于条件判断。
常见用法示例
适用于字符串和数组(需注意数组的 indexOf 在旧环境兼容性):
- 字符串中判断字符是否存在:
if (~str.indexOf('e')) { /* 包含 'e' */ } - 数组中判断元素是否存在:
if (~arr.indexOf(42)) { /* arr 中有 42 */ } - 配合三元运算:
const has = ~list.indexOf(item) ? 'yes' : 'no';
注意事项和替代方案
这种写法虽简短,但可读性较低,尤其对新手不友好。现代代码更推荐语义清晰的替代方式:
- 字符串用
includes():str.includes('x') - 数组也用
includes()(ES2016+):arr.includes(5) - 需要索引时再用
indexOf() >= 0,逻辑直白不易出错 - IE 不支持
includes(),如需兼容旧浏览器,~indexOf()仍可作为轻量 fallback
别误用在对象或类数组上
indexOf() 是数组和字符串原型方法,不能直接用于普通对象或 NodeList 等类数组(除非显式借用):
- 错误:
{a:1, b:2}.indexOf(1)→ 报错(无该方法) - 正确(类数组):
[].indexOf.call(nodelist, item)或转数组再用includes
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











