includes 检查是否包含,** 是指数运算符。
核心两个:
① arr.includes(x)——数组是否包含 x
② str.includes(x)——字符串是否包含 x
③ 2 ** 3——2 的 3 次方 = 8
坑:includes 能查 NaN(indexOf 不能)、** 比 Math.pow 直观、includes 返回布尔值。
indexOf 是"告诉你它在第几号货架",找不到就报 -1,你还得自己判断一下;includes 是直接答"有/没有"。
// 一排货架,5 件商品 let arr = [1, 2, 3, 4, 5]; // 以前:indexOf 找不到返回 -1,还得 !== -1 转成布尔 // true console.log(arr.indexOf(1) !== -1); // 现在:includes 直接给 true / false // true(有) console.log(arr.includes(1)); // false(没有) console.log(arr.includes(9));
indexOf 内部用 === 比较,而 NaN 是个"谁都不认识它"的怪东西,NaN === NaN 居然是 false。includes 用的是另一套比较规则,能认出 NaN。
// -1(找不到!因为 NaN !== NaN) console.log([NaN].indexOf(NaN)); // true(includes 能认出来) console.log([NaN].includes(NaN));
如果你要判断数组里有没有 NaN,还用 indexOf,就会一直以为没有——因为 NaN 自己都不等于自己。换成 includes 就正常了。这是两者最大的行为差异。
数学课本里"几次方"就一个小上标,JS 以前得调 Math.pow 函数,现在直接用两个星号 **。
// 以前:调用函数 // 1024 console.log(Math.pow(2, 10)); // 27 console.log(Math.pow(3, 3)); // 现在:** 就是乘方 // 1024 console.log(2 ** 10); // 27 console.log(3 ** 3);
// 1.414...(0.5 次方就是开根号) console.log(2 ** 0.5); // 0.5(负次方是倒数) console.log(2 ** -1); // 先放个数 let x = 3; // 等价于 x = x ** 2,自己平方自己 x **= 2; // 9 console.log(x);
**= 和 +=、-= 是一个套路——"自己等于自己做一次运算",比如 x += 1 是加一,x **= 2 就是平方。
① 可能在什么地方用:判断菜单/权限里有没有某项、购物车是否含某商品、做幂等/分页计算(2 ** page)、判断值是否在白名单里。
② 常见的问题:用 indexOf !== -1 判断 NaN 永远 false;把 ** 写成 ^(^ 在 JS 里是异或,不是乘方);和 Math.pow 混用导致阅读混乱。
③ 解决思路:判存在一律用 includes(含 NaN);乘方用 **,别用 ^;老代码里看到 Math.pow(a, b) 可放心等价替换成 a ** b。
| API | 作用 | 参数 | 返回值 | 代码示例 |
|---|---|---|---|---|
| arr.includes(x) | 数组里有没有某项(认 NaN) | 要查的值 | true / false | [1, 2].includes(2); |
| a ** b | 乘方:a 的 b 次方 | 底数, 指数 | 数字 | 2 ** 10; // 1024 |