你是不是也见过这样的代码:<a href="javascript:void(0)">点击我</a>?明明想让链接点了没反应,为什么要写void(0)而不是直接空着?或者在看别人的代码时,遇到void function(){}()这样的写法,完全摸不着头脑?其实这些都是 JavaScript 中void操作符的用法。今天就来把这个看似冷门的操作符讲透,让你不仅知道它是什么,还能在合适的场景用对它。
一、void 操作符是什么?一句话讲清核心作用
void操作符的核心功能只有一个:执行一个表达式,然后返回undefined。
简单说,它就像一个 “执行器”,不管你给它什么表达式(比如函数调用、算术运算、变量赋值),它都会乖乖执行,但最后只会给你一个结果:undefined。比如:
void 1 + 2; // 执行1+2,返回undefined(注意优先级,实际等效于(void 1) + 2,结果是NaN,这里仅举例逻辑)
void (1 + 2); // 执行1+2,返回undefined |
为什么需要这样一个操作符?因为它能帮你 “强制执行表达式” 的同时,“忽略表达式的返回值”,只留下一个纯粹的undefined。这在很多场景下能避免意外的副作用。
二、void 操作符的 3 个核心用法:从基础到进阶
1. 最经典:阻止链接跳转(<a>标签里的void(0))
在 HTML 里,<a>标签的href如果是空值或#,点击时会跳转到页面顶部,这往往不是我们想要的。而javascript:void(0)的作用就是:点击链接时执行void(0)(也就是执行 “0” 这个表达式,然后返回 undefined),既不会跳转,也不会刷新页面。
<!-- 点击会跳转到顶部 -->
<a href="#">点我试试</a> <!-- 点击无反应,符合预期 --> <a href="javascript:void(0)">点我试试</a> |
这里的0可以换成任何表达式(比如void(1+1)),效果都一样,只是void(0)是约定俗成的写法,简洁明了。
2. 确保返回 undefined,避免意外赋值
有时候函数或表达式的返回值可能被误操作,用void可以强制返回undefined,避免 bug。比如:
// 正常情况下,赋值表达式会返回赋值结果
let a; console.log(a = 10); // 输出10(赋值表达式返回10) // 用void包裹后,执行赋值但返回undefined console.log(void (a = 20)); // 输出undefined(a确实被改成了20,但返回值是undefined) |
在箭头函数里也很有用。比如你想让函数只执行操作,不返回任何值(默认返回undefined),但怕不小心写了表达式导致返回值泄露:
// 不小心返回了数组(可能不符合预期)
const fn1 = () => [1, 2, 3]; console.log(fn1()); // 输出[1,2,3] // 用void确保返回undefined const fn2 = () => void [1, 2, 3]; console.log(fn2()); // 输出undefined |
3. 声明立即执行函数(IIFE)的另类写法
以前没有箭头函数时,立即执行函数(IIFE)常写成(function(){})()。但用void也能实现,而且更简洁:
// 传统IIFE写法
(function() { console.log('我会立即执行'); })(); // void版IIFE(效果完全一样) void function() { console.log('我也会立即执行'); }(); |
原理是:void会强制执行后面的函数调用表达式,而函数调用本身会执行函数体,最后void返回undefined(这里我们不关心返回值,只需要执行函数)。
三、使用 void 的注意事项:避开这些坑
- 优先级问题:void的优先级比大多数运算符低,比如void 1 + 2会被解析为(void 1) + 2(结果是undefined + 2 = NaN),而不是void (1 + 2)。如果表达式包含运算符,最好加括号:void (1 + 2)。
- 别和 undefined 画等号:虽然void 0返回undefined,但在某些旧环境中(比如 IE8),undefined可以被重写(var undefined = 123),而void 0始终返回真正的undefined。不过现代浏览器已经修复了undefined可重写的问题,现在两者在大多数场景下等效,但void 0更短,很多库还在沿用。
- 不要滥用:void的核心价值是 “执行表达式并返回 undefined”,如果不需要这个特性,就没必要用。比如单纯想获取undefined,直接写undefined比void 0更易读。
四、总结:什么时候该用 void?
简单记三个场景:
- 写<a>标签时,用javascript:void(0)阻止跳转;
- 需要 “执行表达式但明确忽略返回值” 时,比如箭头函数、赋值操作;
- 写 IIFE 时想省点代码(不过现在箭头函数更常用)。
void操作符看似简单,却能在很多细节处帮你写出更严谨的代码。下次再见到void(0),就不会再疑惑了 —— 它不过是 “执行一个无意义的表达式(0),然后返回 undefined” 的简洁写法而已。
你在项目中用过void吗?有没有遇到过什么特殊场景?评论区聊聊~
评论