【问题标题】:JavaScript `undefined` vs `void 0`JavaScript `undefined` vs `void 0`
【发布时间】:2011-08-08 16:29:45
【问题描述】:

undefinedvoid 0 之间到底有什么区别?

哪个是首选,为什么?

【问题讨论】:

标签: javascript undefined void


【解决方案1】:

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

【讨论】:

  • 仅仅因为它更广为人知并不意味着它更好或可以互换使用。
  • 同意@daniel-a-white - 我只想明确地返回undefined,而不是运算符的结果(当然它在技术上是相同的,但它更具人类可读性)
【解决方案2】:

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

void <VALUE>.

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

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

【讨论】:

  • 我不认为括号是可选的,因为“JS 在语法上非常松散”,而是因为void 是运算符而不是函数。
  • '您需要直接使用undefined,同时避免不必要的操作数评估以检索相同的undefined 值。' – 这甚至意味着什么?
  • 这实际上不是真的! undefined 是一个全局变量(在 window 上),它默认保存结果运算符 void 0 的值和在一些旧浏览器中可以“重写”。
【解决方案3】:

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

undefined = 1;
console.log(!!undefined); //true
console.log(!!void 0); //false

【讨论】:

  • void 是运算符而不是函数,因此您不必使用void()
  • 如果浏览器允许您重新定义undefined,那么在这些情况下,这样的浏览器不应该也使用重新定义的undefined吗?否则重新定义undefined 会有什么意义?
  • @devios1 确实如此。任何引用window.undefined 的地方,都会有上面代码显示的新值。
  • @ManPersonson 在这种情况下,它并没有重新定义它,它只是在不同的范围(窗口)中定义了一个类似命名的值。
  • undefined 是一个原始值。那里没有有意义的区别。它对您的程序具有完全相同的后果。
【解决方案4】:

undefined has normal variable semantics that not even strict mode can fix 并且需要运行时查找。它可以被阴影 像任何其他变量一样,默认的全局变量undefined 在 ES3 中不是只读的。

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

【讨论】:

  • 在未压缩的代码中更短;如果您使用IIFE,您可以将undefined 缩小为a,而void 0 不可缩小:)
  • @gustavohenke 但是 gzip 呢?如果你缩小你可能会在undefined的不同闭包中得到所有不同的字母,如abcvoid 0 在任何地方都是 void 0。无论如何,这种技术肯定会混淆已经优化undefined(FF,Chrome 但不是 IE10)的 JIT,因为它是一个全局常量,甚至静态分析也可以查看它是否被遮蔽。有了这个,你把它变成了一个普通的变量查找,它肯定不是一个编译时常量。当然这可能无关紧要,但这不是论点:P
  • @gustavohenke see pastebin.com/DDTp7E9c void 0undefined 被识别为编译时常量,但将其保存到变量中是完全不同的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
相关资源
最近更新 更多