const XX=void0

在阅读源码中,经常会看到 const XX=void0这里的 void 0其实就是 undefinedvoid 运算符总会返回一个 undefined 的结果。

那么,为什么要用 void 0 代替 undefined 呢?

总结:
  • undefined 是一个「全局对象(如window)」中的一个「属性」, 在古老版本的浏览器里,它是可以被修改的
  • undefined不是JavaScript的保留字(这点连百度和文心一言回答的都不对),因此它是可以被作为变量标识符而使用的。undefined在全局作用域中不重新赋值,但是在函数作用域中可以重新赋值,但是非常不建议这么做。
    <script>function demo(){let undefined="undefined1";console.log(undefined);}demo()</script>
    
  • void expression 它将会对表达式进行求值,然后返回 undefined 的「原始值」。void 0 总是返回原始值 undefined,无论全局属性 undefined 是否被改写,它都能确保其值是 undefined(原始值)

下面是详细介绍:

一、void 运算符

语法非常简单:

void expression

它将会对表达式进行求值,然后返回 undefined 的「原始值」。那么,void 0 不就是得到 undefined 最简单的写法嘛!(请注意,写法上 void 0 相当于 void(0))。

我们知道,立即函数执行表达式(IIFE)要非常多的写法,使用 void 关键字也是可以的,比如:

void (function () {// some statements
})()// 相当于
void function () { /* some statements */ }()

另外,你应该看过以下类似的写法:

<a href="javascript:0;">Link</a>

我们知道 javascript: 是 JavaScript 中的伪协议,表示将会使用 JS 解析器执行其后的所有语句,若其最后一个JavaScript 语句返回值不为 undefined,那么其返回值将会替换为页面内容。

就以上 HTML 标签,在不同浏览器下点击,会有不同的结果。其中 Chrome、Safari 中点击无任何反馈,而 Firefox 中页面内容将会被替换为 0

为了解决以上差异表现,通常的做法就是使用 void 关键字,比如:

<a href="javascript:void(0);">Link</a>

这也是处理 <a> 标签默认行为的方式之一。

这种伪协议除了在事件处理程序中使用,也可在浏览器地址栏、书签地址中使用。

除此之外,还有一种常用的用法:当箭头函数中只有一行语句,且不需要返回值时,则可以:

element.onclick = () => void doSomething()

二、undefined

你有可能不知道,我们天天写的 undefined,它其实是一个「全局对象」中的一个「属性」。

除了 undefined 之外,类似的还有 NaNInfinityglobalThis 也是全局对象的属性。它们的属性描述对象都是:不可写、不可枚举、不可配置(详看 ECMAScript 19.1 Value Properties of the Global Object)。

{[[writable]]: false,[[enumerable]]: false[[configurable]]: false
}

当然,这个在 ES5 之前是可以被改写的,下面可以对比一下:

img

还有,需要特别注意的是:

undefined 并不是 ECMAScript 标准中的一个保留字,因此它是可以被作为变量标识符而使用的(但项目中千万别这么用),就行 window 一样。

在 ECMAScript 标准中,保留字有以下这些(详见 12.6.2 Keywords and Reserved Words):

undefined不是JavaScript的关键字和保留字,在全局作用域中不重新赋值,但是在函数作用域中可以重新赋值,但是不建议这么做,不建议将undefined作为变量、对象、函数等名称使用,在全局作用域中,undefined不可以重新赋值,即使重新赋值了,但是无效,在全局中输出的依然是undefined

 <script>window.undefined = 1;console.log(window.undefined);//undefined</script>

但是在局部作用域中,可以将undefined作为变量名重新赋值,但是不建议这么做。

 <script>function demo(){let undefined="undefined1";console.log(undefined);}demo()</script>

三、用 void 0 代替 undefined?

void 0 总是返回原始值 undefined,无论全局属性 undefined 是否被改写,它都能确保其值是 undefined(原始值)。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/730059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS——【自动引用计数】ARC规则及实现

1.3.3所有权修饰符 所有权修饰符一共有四种&#xff1a; __strong 修饰符__weak 修饰符__undafe_unretained 修饰符__autoreleasing 修饰符 __strong修饰符 _strong修饰符表示对对象的强引用&#xff0c;持有强引用的变量在超出其作用域的时候会被废弃&#xff0c;随着强引…

对话有赞创始人兼CEO白鸦:AI将如何改变产品体验?

SaaS行业有个老大难问题&#xff0c;系统难用&#xff0c;用户学习的成本太高&#xff0c;并且系统越强大&#xff0c;这个问题就会越明显。AI的出现&#xff0c;似乎让这个问题有了解法&#xff0c;这个赛道中的引领者&#xff0c;已经在尝试用AI重构SaaS&#xff0c;让每个被…

数组连续和 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 给定一个含有N个正整数的数组&#xff0c;求出有多少连续区间&#xff08;包括单个正整数&#xff09;&#xff0c;它们的和大于等于 x。 输入描述 第一行为两个…

Xcode升级到Xcode15.1或15.2之后,无法新建Category和Extension文件,如何解决?

项目场景&#xff1a; Xcode升级到15.1或15.2之后&#xff0c;无法新建Category和Extension文件&#xff0c;并且Xcode不报任何错误 问题描述 Xcode升级到15.1或15.2之后&#xff0c;无法新建Category和Extension文件&#xff0c;并且Xcode不报任何错误。 具体的操作步骤如下…

【MySQL】 隔离级别和锁机制

事务的四种特性 事务具有四个特征&#xff1a;原子性&#xff08; Atomicity &#xff09;、一致性&#xff08; Consistency &#xff09;、隔离性&#xff08; Isolation &#xff09;和持续性&#xff08; Durability &#xff09;。这四个特性简称为 ACID 特性。 原子性。…

redis-集群 原生部署和工具自动部署

什么redis集群&#xff1f; redis集群是一个提供在多个redis节点之间共享数据的程序集。它并不像redis主从复制模式那样仅提供一个master节点来提供写服务&#xff0c;而是会提供多个master节点来提供写服务&#xff0c;每个master节点中存储的数据都不一样&#xff0c;这些数据…

【保姆级爬虫】微博关键词搜索并获取博文和评论内容(python+selenium+chorme)

微博爬虫记录 写这个主要是为了防止自己忘记以及之后的组内工作交接&#xff0c;至于代码美不美观&#xff0c;写的好不好&#xff0c;统统不考虑&#xff0c;我只能说&#xff0c;能跑就不错了&#xff0c;上学压根没学过python好吧&#xff0c;基本上是crtlc&ctrlv丝滑小…

开启AI绘画新纪元:让创意在指尖绽放

文章目录 一、了解AI绘画的基本原理二、选择合适的AI绘画工具三、掌握AI绘画的基本技巧四、借鉴与创新&#xff1a;从模仿到创作五、参与社区交流&#xff0c;共同成长《AI绘画教程&#xff1a;Midjourney使用方法与技巧从入门到精通》亮点推荐内容简介作者简介目录 在科技日新…

Linux centos 常用的网络负载和网速查看工具和命令

在 CentOS 上查看网络速度和网络负载&#xff0c;可以使用多种工具&#xff0c;以下是一些常用的命令行工具&#xff1a; iftop - 用于实时监视网络带宽使用情况。 安装命令&#xff1a; sudo yum install iftop 使用命令&#xff1a; sudo iftop nload - 一个简单的控制…

Doris-数据分区

数据分区&#xff1a;即将大表划分为小表&#xff0c;数据分区主要有两个级别&#xff1a;Partition和Bucket&#xff08;Tablet&#xff09;。 Partition&#xff1a;逻辑分区&#xff0c;按照一定规则将表按照行进行划分&#xff0c;每个部分就是一个Partition。 Bucket&…

【面试题】Rocketmq面试题总结

为什么使用消息队列&#xff08;如RocketMQ&#xff09;&#xff1f; 异步处理&#xff1a;解耦系统间调用&#xff0c;提高响应速度。解耦&#xff1a;降低模块间的直接依赖&#xff0c;使系统更易于扩展和维护。流量削峰&#xff1a;在高峰期将请求暂时存储起来&#xff0c;…

flink重温笔记(十):Flink 高级 API 开发——flink 四大基石之 State(涉及Checkpoint)

Flink学习笔记 前言&#xff1a;今天是学习 flink 的第 10 天啦&#xff01;学习了 flink 四大基石之 State &#xff08;状态&#xff09;&#xff0c;主要是解决大数据领域增量计算的效果&#xff0c;能够保存已经计算过的结果数据状态&#xff01;重点学习了 state 的类型划…

相对于 Linux,Windows Server 存在的意义是什么?

相对于 Linux&#xff0c;Windows Server 存在的意义是什么&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux 的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给…

【LeetCode】389_找不同_C

题目描述 给定两个字符串 s 和 t &#xff0c;它们只包含小写字母。 字符串 t 由字符串 s 随机重排&#xff0c;然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 https://leetcode.cn/problems/find-the-difference/description/ 示例 示例 1&#xff1a; 输…

新版AndroidStudio的Gradle窗口显示task list not built 问题解决

在使用新版AndroidStudio时&#xff0c;会出现&#xff0c;Task List not built 的问题。如果你记得task的名字&#xff0c;当然可以 直接通过命令 gradle taskname 或者 ./gradlew taskName直接执行即可&#xff0c;但是若是记不住&#xff0c;还是把这个任务构建处理比较好用…

借助工具优化开发流程,提升开发体验

背景 最近在做一个demo&#xff0c;只有一个html页面&#xff0c;需要开启一个https web server&#xff0c;以此来实现在浏览器中访问。 改造前 改造前&#xff0c;每次修改文件保存后都要刷新一下浏览器。 如果只是短时间&#xff0c;每次修改后手动刷新浏览器也还行。主要…

C++:Stack和Queue的模拟实现

创作不易&#xff0c;感谢三连&#xff01; 一、容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结)&#xff0c;该种模式是将一个类的接口转换成客户希望的另外一个接口。 就如同是电源适配器将不适用的交流电…

用不了google翻译怎么办?

如果无法使用谷歌翻译&#xff0c;你可以尝试以下方法&#xff1a; 寻找替代服务&#xff1a;可以搜索并了解其他翻译服务&#xff0c;如百度翻译、有道翻译等。这些服务通常提供免费或低价的翻译服务&#xff0c;以满足日常需求。使用本地翻译工具&#xff1a;在某些国家和地…

2k_Day1:今天是设计模式的大白话1

大白话&#xff1a; 原则有一点很难做到&#xff0c;就是定义好的类&#xff0c;只能加不能改&#xff08;开放-关闭原则&#xff09; 1.工厂模式就是&#xff0c;比如你定了一个汽车接口&#xff0c;然后小车、中车、大车都继承这个接口&#xff0c;这时&#xff0c;定一个汽…

在明确自己已经下载好了依赖库,但Vue3引用第三方模块报错Could not find a declaration file for module ***

在 Vue 3 TypeScript 项目中&#xff0c;引入第三方库时&#xff0c;有时会遇到该模块无定义文件的问题。通常&#xff0c;我们可以尝试以下两种方式解决: 方法 1: 使用 require 语句 在 TypeScript 文件中&#xff0c;使用 require 语句来代替 import 语句&#xff0c;例如…