此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
void 运算符
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
void 运算符对给定的表达式进行求值,然后返回undefined。
In this article
尝试一下
const output = void 1;console.log(output);// Expected output: undefinedvoid console.log("expression evaluated");// Expected output: "expression evaluated"void (function iife() { console.log("iife is executed");})();// Expected output: "iife is executed"void function test() { console.log("test function executed");};try { test();} catch (e) { console.log("test function is not defined"); // Expected output: "test function is not defined"}语法
void expression描述
这个运算符允许在表达式执行完成时,产生(某些地方)期望获得的undefined 值。
void 运算符通常只用于获取undefined 的原始值,一般使用void(0)(等同于void 0)。在上述情况中,也可以使用全局变量undefined 来代替。
需要注意考虑void 运算符的优先级,以下加括号的表达式的例子可以帮助你清楚地理解void 操作符的优先级:
void 2 === "2"; // (void 2) === '2',返回 falsevoid (2 === "2"); // void (2 === '2'),返回 undefined示例
>立即调用的函数表达式
在使用立即调用的函数表达式时,function 关键字不可直接位于语句开头,因为该表达式会被解析为函数声明,并会在解析到代表调用的括号时产生语法错误。如果是匿名函数,那么如果函数被解析为声明,就会立即产生语法错误。
function iife() { console.log("Executed!");}(); // SyntaxError: Unexpected token ')'function () { console.log("Executed!");}(); // SyntaxError: Function statements require a function name为了使函数被解析为表达式,function 关键字必须出现在一个只接受表达式而不是语句的位置。这可以通过在关键字前加一个一元运算符来实现,它只接受表达式作为操作数。函数调用的优先级比一元运算符高,所以它将被首先执行。它的返回值(几乎总是undefined)将被传递给一元运算符,然后立即被丢弃。
在所有的一元运算符中,void 提供了最好的语义,因为它明确表示函数调用的返回值应该被丢弃。
void (function () { console.log("Executed!");})();// Output: "Executed!"这比用圆括号包裹函数表达式要长一些,圆括号的作用是强迫function 关键字被解析为表达式的开始,而不是语句。
(function () { console.log("Executed!");})();JavaScript URI
当用户点击一个以#"/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/undefined">undefined。void 运算符可用于返回undefined。例如:
<a href="#"> 这个链接点击之后不会做任何事情 </a><a href="#"> 点击这个链接会让页面背景变成绿色。</a>备注:利用 箭头函数标准中,允许在函数体不使用括号来直接返回值。如果右侧调用了一个原本没有返回值的函数,其返回值改变后,则会导致非预期的副作用。安全起见,当函数返回值不会被使用到的时候,应该使用 这确保了当#"在箭头函数中避免泄漏" >在箭头函数中避免泄漏
void 运算符,来确保 API 改变时,并不会改变箭头函数的行为。button.onclick = () => void doSomething();doSomething 的返回值从undefined 变为true 的时候,不会改变代码的行为。规范
Specification ECMAScript® 2026 Language Specification>
# sec-void-operator>浏览器兼容性
参见
- JavaScript
- 教程
- 参考
内置对象
- AggregateError
- Array
- ArrayBuffer
- AsyncDisposableStack
- AsyncFunction
- AsyncGenerator
- AsyncGeneratorFunction
- AsyncIterator
- Atomics
- BigInt
- BigInt64Array
- BigUint64Array
- Boolean
- DataView
- Date
- decodeURI()
- decodeURIComponent()
- DisposableStack
- encodeURI()
- encodeURIComponent()
- Error
- escape()已弃用
- eval()
- EvalError
- FinalizationRegistry
- Float16Array
- Float32Array
- Float64Array
- Function
- Generator
- GeneratorFunction
- globalThis
- Infinity
- Int8Array
- Int16Array
- Int32Array
- InternalError非标准
- Intl
- isFinite()
- isNaN()
- Iterator
- JSON
- Map
- Math
- NaN
- Number
- Object
- parseFloat
- parseInt
- Promise
- Proxy
- RangeError
- ReferenceError
- Reflect
- RegExp
- Set
- SharedArrayBuffer
- String
- SuppressedError
- Symbol
- SyntaxError
- Temporal实验性
- TypedArray
- TypeError
- Uint8Array
- Uint8ClampedArray
- Uint16Array
- Uint32Array
- undefined
- unescape()已弃用
- URIError
- WeakMap
- WeakRef
- WeakSet
表达式和运算符
- 加法(+)
- 加法赋值(+=)
- 赋值(=)
- 异步函数(async function)表达式
- async function* 表达式
- await
- 按位与(&)
- 按位与赋值(&=)
- 按位非(~)
- 按位或(|)
- 按位或赋值(|=)
- 按位异或(^)
- 按位异或赋值 (^=)
- 类表达式
- 逗号运算符(,)
- 条件(三元)运算符
- 自减(--)
- delete 运算符
- 解构
- 除法(/)
- 除法赋值(/=)
- 相等(==)
- 幂(**)
- 幂赋值(**=)
- 函数表达式
- function* 表达式
- 大于(>)
- 大于等于(>=)
- 圆括号运算符
- import.meta
- import()
- in
- 自增(++)
- 不相等(!=)
- instanceof
- 左移 (<<)
- 左移赋值(<<=)
- 小于(<)
- 小于等于(<=)
- 逻辑与(&&)
- 逻辑与赋值(&&=)
- 逻辑非(!)
- 逻辑或(||)
- 逻辑或赋值(||=)
- 乘法(*)
- 乘法赋值(*=)
- new
- new.target
- null
- 逻辑空赋值(??=)
- 空值合并运算符(??)
- 对象初始化器
- 运算符优先级
- 可选链运算符(?.)
- 属性访问器
- 取余(%)
- 取余赋值(%=)
- 右移(>>)
- 右移赋值(>>=)
- 展开语法(...)
- 严格相等(===)
- 严格不相等(!==)
- 减法(-)
- 减法赋值(-=)
- super
- this
- typeof
- 一元减(-)
- 一元加(+)
- 无符号右移(>>>)
- 无符号右移赋值(>>>=)
- void 运算符
- yield
- yield*
正则表达式
- Backreference: \1, \2
- Capturing group: (...)
- Character class escape: \d, \D, \w, \W, \s, \S
- Character class: [...], [^...]
- 字符转义:\\n、\\u{...}
- Disjunction: |
- Input boundary assertion: ^, $
- 字面字符:a、b
- Lookahead assertion: (?=...), (?!...)
- Lookbehind assertion: (?<=...), (?<!...)
- Modifier: (?ims-ims:...)
- Named backreference: \k<name>
- Named capturing group: (?<name>...)
- Non-capturing group: (?:...)
- 量词:*、+、?、{n}、{n,}、{n,m}
- Unicode 字符类转义:\p{...}、\P{...}
- Wildcard: .
- Word boundary assertion: \b, \B
错误
- AggregateError: No Promise in Promise.any was resolved
- Error: Permission denied to access property "x"
- InternalError: too much recursion
- RangeError: argument is not a valid code point
- RangeError: BigInt division by zero
- RangeError: BigInt negative exponent
- RangeError: form must be one of 'NFC', 'NFD', 'NFKC', or 'NFKD'
- RangeError: invalid array length
- RangeError: invalid date
- RangeError: precision is out of range
- RangeError: radix must be an integer
- RangeError: repeat count must be less than infinity
- RangeError: repeat count must be non-negative
- RangeError: x can't be converted to BigInt because it isn't an integer
- ReferenceError: "x" is not defined
- ReferenceError: assignment to undeclared variable "x"
- ReferenceError: can't access lexical declaration`X' before initialization
- ReferenceError: must call super constructor before using 'this' in derived class constructor
- ReferenceError: super() called twice in derived class constructor
- SyntaxError: 'arguments'/'eval' can't be defined or assigned to in strict mode code
- SyntaxError: "0"-prefixed octal literals are deprecated
- SyntaxError: "use strict" not allowed in function with non-simple parameters
- SyntaxError: "x" is a reserved identifier
- SyntaxError: \ at end of pattern
- SyntaxError: a declaration in the head of a for-of loop can't have an initializer
- SyntaxError: applying the 'delete' operator to an unqualified name is deprecated
- SyntaxError: arguments is not valid in fields
- SyntaxError: await is only valid in async functions, async generators and modules
- SyntaxError: await/yield expression can't be used in parameter
- SyntaxError: cannot use `??` unparenthesized within `||` and `&&` expressions
- SyntaxError: character class escape cannot be used in class range in regular expression
- SyntaxError: continue must be inside loop
- SyntaxError: duplicate capture group name in regular expression
- SyntaxError: duplicate formal argument x
- SyntaxError: for-in loop head declarations may not have initializers
- SyntaxError: function statement requires a name
- SyntaxError: functions cannot be labelled
- SyntaxError: getter and setter for private name #x should either be both static or non-static
- SyntaxError: getter functions must have no arguments
- SyntaxError: identifier starts immediately after numeric literal
- SyntaxError: illegal character
- SyntaxError: import declarations may only appear at top level of a module
- SyntaxError: incomplete quantifier in regular expression
- SyntaxError: invalid assignment left-hand side
- SyntaxError: invalid BigInt syntax
- SyntaxError: invalid capture group name in regular expression
- SyntaxError: invalid character in class in regular expression
- SyntaxError: invalid class set operation in regular expression
- SyntaxError: invalid decimal escape in regular expression
- SyntaxError: invalid identity escape in regular expression
- SyntaxError: invalid named capture reference in regular expression
- SyntaxError: invalid property name in regular expression
- SyntaxError: invalid range in character class
- SyntaxError: invalid regexp group
- SyntaxError: invalid regular expression flag "x"
- SyntaxError: invalid unicode escape in regular expression
- SyntaxError: JSON.parse: bad parsing
- SyntaxError: label not found
- SyntaxError: missing : after property id
- SyntaxError: missing ) after argument list
- SyntaxError: missing ) after condition
- SyntaxError: missing ] after element list
- SyntaxError: missing } after function body
- SyntaxError: missing } after property list
- SyntaxError: missing = in const declaration
- SyntaxError: missing formal parameter
- SyntaxError: missing name after . operator
- SyntaxError: missing variable name
- SyntaxError: negated character class with strings in regular expression
- SyntaxError: new keyword cannot be used with an optional chain
- SyntaxError: nothing to repeat
- SyntaxError: numbers out of order in {} quantifier.
- SyntaxError: octal escape sequences can't be used in untagged template literals or in strict mode code
- SyntaxError: parameter after rest parameter
- SyntaxError: private fields can't be deleted
- SyntaxError: property name __proto__ appears more than once in object literal
- SyntaxError: raw bracket is not allowed in regular expression with unicode flag
- SyntaxError: redeclaration of formal parameter "x"
- SyntaxError: reference to undeclared private field or method #x
- SyntaxError: rest parameter may not have a default
- SyntaxError: return not in function
- SyntaxError: setter functions must have one argument
- SyntaxError: string literal contains an unescaped line break
- SyntaxError: super() is only valid in derived class constructors
- SyntaxError: tagged template cannot be used with optional chain
- SyntaxError: Unexpected '#' used outside of class body
- SyntaxError: Unexpected token
- SyntaxError: unlabeled break must be inside loop or switch
- SyntaxError: unparenthesized unary expression can't appear on the left-hand side of '**'
- SyntaxError: use of super property/member accesses only valid within methods or eval code within methods
- SyntaxError: Using //@ to indicate sourceURL pragmas is deprecated. Use //# instead
- ReferenceError: deprecated caller or arguments usage
- TypeError: 'x' is not iterable
- TypeError: "x" is (not) "y"
- TypeError: "x" is not a constructor
- TypeError: "x" is not a function
- TypeError: "x" is not a non-null object
- TypeError: "x" is read-only
- TypeError: already executing generator
- TypeError: BigInt value can't be serialized in JSON
- TypeError: calling a builtin X constructor without new is forbidden
- TypeError: can't access/set private field or method: object is not the right class
- TypeError: can't assign to property "x" on "y": not an object
- TypeError: can't convert BigInt to number
- TypeError: can't convert x to BigInt
- TypeError: can't define property "x": "obj" is not extensible
- TypeError: can't delete non-configurable array element
- TypeError: can't redefine non-configurable property "x"
- TypeError: can't set prototype of this object
- TypeError: can't set prototype: it would cause a prototype chain cycle
- TypeError: invalid 'in' operand "x"
- TypeError: class constructors must be invoked with 'new'
- TypeError: cyclic object value
- TypeError: derived class constructor returned invalid value x
- TypeError: getting private setter-only property
- TypeError: Initializing an object twice is an error with private fields/methods
- TypeError: invalid 'instanceof' operand 'x'
- TypeError: invalid Array.prototype.sort argument
- TypeError: invalid assignment to const "x"
- TypeError: Iterator/AsyncIterator constructor can't be used directly
- TypeError: matchAll/replaceAll must be called with a global RegExp
- TypeError: More arguments needed
- TypeError: "x" has no properties
- TypeError: property "x" is non-configurable and can't be deleted
- TypeError: Reduce of empty array with no initial value
- TypeError: setting getter-only property "x"
- TypeError: WeakSet key/WeakMap value 'x' must be an object or an unregistered symbol
- X.prototype.y called on incompatible type
- URIError: malformed URI sequence
- Warning: -file- is being assigned a //# sourceMappingURL, but already has one
- Warning: unreachable code after return statement