JavaScript `undefined` 与 `void 0`

IT技术 javascript undefined void
2021-03-09 16:11:24

undefined之间究竟有什么区别void 0

哪个是首选,为什么?

4个回答

不同之处在于某些浏览器允许您覆盖undefined. 但是,void anything总是返回真正的undefined

undefined = 1;
console.log(!!undefined); //true
console.log(!!void 0); //false
@devios1 确实如此。任何window.undefined被引用的地方,它都会有新的值,这就是上面的代码所显示的。
2021-04-20 16:11:24
如果浏览器让你重新定义undefined,那么在这些情况下,这样的浏览器不应该也使用重新定义undefined吗?undefined否则重新定义可能有什么意义
2021-04-22 16:11:24
void是运算符而不是函数,因此您不必使用void().
2021-05-02 16:11:24
@ManPersonson 在这种情况下,它不会重新定义它,它只是在不同的范围(窗口)中定义一个类似命名的值。
2021-05-03 16:11:24
undefined是原始值。那里没有有意义的区别。它对您的程序具有完全相同的结果。
2021-05-15 16:11:24

undefined 具有正常的变量语义,即使是严格模式也无法修复,并且需要运行时查找。它可以像任何其他变量一样被隐藏,并且默认的全局变量undefined在 ES3 中不是只读的。

void 0实际上是一个编译时防弹常量undefined,没有查找要求。这就像编写nullor true,而不是查找变量值。它开箱即用,没有任何安全参数,而且编写时间较短。它在各方面都更好。

@gustavohenke 但是 gzip 呢?如果你缩小你可能会得到所有不同的字母,比如a b c在不同的闭包中undefined哪里void 0都是void 0哪里。无论如何,这种技术肯定会混淆已经优化的 JIT undefined(FF、Chrome 但不是 IE10),因为它是一个全局常量,甚至静态分析也可以查看它是否被遮蔽。有了这个,你把它变成了一个普通的变量查找,它肯定不是一个编译时常量。当然,这可能无关紧要,但这不是论点:P
2021-04-22 16:11:24
@gustavohenke 参见pastebin.com/DDTp7E9c void 0并被undefined识别为编译时常量,但将其保存到变量中则完全不同
2021-05-01 16:11:24
只是在未压缩的代码中更短;如果您使用IIFE,您可以缩小undefined到类似的东西a,而void 0不能缩小:)
2021-05-11 16:11:24

使用undefined. 它比 更广为人知void(0)

仅仅因为它更广为人知并不意味着它更好或可以互换使用。
2021-04-25 16:11:24

此处的括号是可选的void 0void(0)void (0)是等效的。void是一元运算符具有从右到左结合,因此值被放置在它的右边:

void <VALUE>.

对于第二个问题,您需要undefined直接使用,同时避免不需要的操作数评估来检索相同的undefined值。

参考中的更多信息:https : //developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/void

“您需要undefined直接使用,同时避免不需要的操作数评估来检索相同的undefined值。” - 那有什么意思?
2021-04-20 16:11:24
我不认为括号是可选的,因为“JS 在语法上非常松散”,而是因为void是运算符而不是函数。
2021-04-21 16:11:24
这实际上不是真的! undefined是一个全局(on to of window)变量,默认情况下保存结果运算符的值,void 0并且在一些旧浏览器中可以“重写”。
2021-04-21 16:11:24