Js为什么常用void 0代替undefined?

更新日期: 2023-01-09阅读: 794标签: undefined

大家都知道void运算符总会返回一个undefined的结果,那么为什么要用void 0来代替undefined呢(注意:写法上void(0)相当于void 0 )?这不是多此一举了吗?下面为大家讲讲这样使用的原因。


避免undefined被重新赋值

为什么用void 0代替,首先void是保留字,不可以呗覆盖重写,void运算符可以对后面的表达式进行运算并且返回undefined.也就是void后边无论是是什么都返回undefined,而运算式最简单的是0,所以就用void 0来表示。

而undefined 在Js中只是一个全局变量,表示变量或属性未定义的值。由于undefined它其实是一个「全局对象」中的一个全局变量,所以它可能会被重新赋值。

ps:除了 undefined 之外,类似的还有 NaN、Infinity、globalThis 也是全局对象的属性。它们的属性描述对象都是:不可写、不可枚举、不可配置

例如,在下面的代码中,我们可以看到 undefined 被重新赋值为字符串 " fly63前端网  ":

undefined = "fly63前端网!"; console.log(undefined);  //fly63前端网

因此,为了避免 undefined 被重新赋值,有时候可能会使用 void 0 来代替 undefined。

void 0 表示对于任何给定的表达式,它都会返回 undefined。因为 void 操作符接受一个表达式作为参数,所以不可能被重新赋值。

例如,下面的代码中,我们可以看到 void 0 会返回 undefined:

console.log(void 0);  //undefined
还有,需要特别注意的是:
undefined 并不是 ECMAScript 标准中的一个保留字,因此它是可以被作为变量标识符而使用的(但项目中千万别这么用),就行 window 一样。


void 0 节省字节

void 0比undefined字符所占空间少。比如著名的工具库 underscore 大量使用了 void 0 来代替 undefined,再者 UglifyJS、Terser 等代码压缩工具也会将 undefined 转换为 void 0,这样可以节省一些字节:

function isUndefined(x) {
return x === undefined
}

// Minified
function isUndefined(n){return void 0===n}

但我们在编写代码的时候,直接使用 undefined 也是没有太大问题的,注意下前面提到的一些点就好了,其余的就交由工具来处理即可。


void 0 其他应用

除了取undefined外,void还有什么其它用处吗?

还有一个常见的功能,填充href。比如:微博截图,它的转发, 收藏, 讨论都是超链接,但是用户并不希望点击它们会跳转到另一个页面,而是引发出一些交互操作。

<a href="javascript:void(0);">
这个链接点击之后不会做任何事情,
如果去掉 void(),点击之后整个页面会被替换成一个字符 0。
</a>
<p> chrome中即使<a href="javascript:0;">也没变化,firefox中会变成一个字符串0 </p>
<a href="javascript:void(document.body.style.backgroundColor='green');">
点击这个链接会让页面背景变成绿色。
</a>

理论上而言,超链接如果没有URL,点击它就会刷新整个页面。于是便用上了href=”javascript:void(0)的方式,确保点击它会执行一个纯粹无聊的void(0)。

另一种情况是,如果我们要生成一个空的src的image,最好的方式似乎也是src=’javascript:void(0)’。

注意,虽然这么做是可行的,但利用 javascript: 伪协议来执行 JavaScript 代码是不推荐的,所以推荐使用其他标签


总结

void有如下作用:

- 通过采用void 0取undefined比采用字面上的undefined更靠谱更安全,应该优先采用void 0这种方式。

- 填充的href确保点击时不会产生页面跳转; 填充的src,确保不会向服务器发出垃圾请求。


链接: https://www.fly63.com/article/detial/12304

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!