JS基礎:void冷知識
JS 基礎:void 冷知識
文章目錄
- JS 基礎:void 冷知識
- 簡介
- 參考
- 正文
- 語法
- Usage 作用
- Application
- ``
- IIFE(Immediately Invoked Function Expression)
- 箭頭函數
- 結語
簡介
今天來介紹一下 JS 規範中超級沒有存在感的運算符:void
。啥?聽都沒聽過?我也沒聽過,要說本篇的來源是某次在 babel 首頁編譯後的代碼裡面無意間撇到一個 void
// 有興趣的可以到 babel 首頁嘗試
// 編譯前
() => { this }// 編譯後
var _this = void 0;
(funciont() {_this;
}());// 有趣的是英文版首頁的編譯又是另一種結果
() => { void 0; };
當下心理道:這都是些啥東東的呢。。。
參考
JS 冷知識: 你所不知道的 void | https://kuro.tw/posts/2019/08/04/JS-%E5%86%B7%E7%9F%A5%E8%AD%98-%E4%BD%A0%E6%89%80%E4%B8%8D%E7%9F%A5%E9%81%93%E7%9A%84-void/ |
void 运算符 | https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/void |
正文
我們直接進入正題,void 到底哪來的?void 的作用是啥?void 都用在哪?
語法
在介紹其來源之前,我們先來介紹一下他的語法:
void expression
void expression
void 關鍵字作為一元運算符後面能夠接一個表達式,並且不管表達式為何都會返回 undefined
(這很重要,先記下來)
也就是說如下代碼:
let i = void 0
// i = undefined
let j = void (i = 2)
// i = 2
// j = undefined
Usage 作用
好了我們現在知道他會返回 undefined
了,然後勒?能幹嘛?
void
作為一個運算符關鍵字其實早早就被加入到 ES 的標準裡面。而我猜加入他的初衷可能是因為:undefined
並不是保留字。是的沒錯你眼睛沒花,在早早的遠古時代大家就發現 ES 規範裡面並沒有把 undefined
劃入保留字裡面,也就是說你是可以創建一個名叫 undefined
的變量的!(雖然這樣完全沒有意義)
var undefined = 0
// 親側這樣寫是合法的,但是現在的 chrome 瀏覽器已經失效了
當然現在也不會有人這麼無聊,所以我也不想在這個問題上糾結太多。但是也不知道 ES 小組到底是不是因為注意到了這件事,又不想破壞原本的規範(可能是考慮到或許有人的程序聲明了叫 undefined 的變量,所以不想破壞兼容行,我猜啦),因此才推出一個新的運算符 void。他能夠成為替代 undefined,確保表達是一定會返回 undefined。
Application
<a href="javascript:void(0)"></a>
當初早期的時候一定可以常常看見 html 的鏈結標籤(<a>
)中出現過這種東西:
<a href="javascript:void(0)"></a>
這是由於 a
標籤的默認行為是會把 href 解析 url 後的資源用當前網頁替代,因此如果沒有返回 void 就會把整個網頁換成一個 0。現在許多回調方法,或是綁定的監聽函數都會要求調用 e.preventDefault()
也是為了同樣的效果。
**注意!**當然,現在繼續使用 javascript:
這種偽協議已經不再推薦了
IIFE(Immediately Invoked Function Expression)
依舊是遠古時代,當開發者需要區分作用域或加載時立刻執行的代碼塊,曾經引入過一種立即函數(IIFE)方法,他本身也是一個表達式,有可能會造成返回洩漏,所以也可以透過 void 包裝起來:
void (function (val) {console.log(123 + val)
})(123)
如此一來就能避免 IIFE 的返回值暴露到調用函數之外了
箭頭函數
ES6 出現的箭頭函數有時候也會有和 IIFE 類似的疑慮,當沒有函數體也不需要返回值的時候就也需要使用 void 做包裝:
let user = {name: 'John',password: '123456789'
}
const setPassword = (newPassword) => (void user.password = newPassword)
如此一來就可以阻止箭頭函數的洩漏
結語
本篇介紹了一個較為冷門的運算符 void。即時在實際開發的時候很少人會直接使用到,但是在 babel 編譯的背後依舊能看見他的身影,說明這個運算符依舊在不那麼顯眼的地方發揮它的作用,並且許多 babel 實現的兼容舊版本的能力有需多便是要依靠更接近 JS 本身語言特性的 API,多學多會多看多聽,技多不壓身,說不定哪天就遇到必須使用 void 來解決的問題也說不定。
JS基礎:void冷知識相关推荐
- JS基礎:Hoisting 變量提升、TDZ 暫時性死區(Temporal Dead Zone)
JS 基礎:Hoisting 變量提升.TDZ 暫時性死區(Temporal Dead Zone) 文章目錄 JS 基礎:Hoisting 變量提升.TDZ 暫時性死區(Temporal Dead Z ...
- JS基礎:Closure 閉包
JS 基礎:Closure 閉包 文章目錄 JS 基礎:Closure 閉包 簡介 參考 正文 IIFE 立即執行函數(Immediately Invoked Functions Expression ...
- JS基礎:Prototype Chain 原型鏈
JS 基礎:Prototype Chain 原型鏈 文章目錄 JS 基礎:Prototype Chain 原型鏈 簡介 參考 正文 Object 對象創建 直接量 `{}` 內置構造函數 `new O ...
- stm32h7内存分配_【STM32H7教程】第25章 STM32H7的TCM,SRAM等五塊內存基礎知識
第25章 STM32H7的TCM,SRAM等五塊內存基礎知識 本章教程為大家介紹STM32H7帶的ITCM,DTCM,AXI SRAM,SRAM1,SRAM2,SRAM3,SRAM4和備份 ...
- 文明5新手的基礎知識
文明玩到現在也累積了一些經驗.由於功力不夠,只能提供一些基礎中的基礎,盼能拋磚引玉,還請高手們不吝指正. 一. 坐城: 移民坐城的規則,應該已經是常識了.當一座城建立時,就會產生4紅臉( ...
- Remoting學習(三)----Reomoting 基楚知識
Remoting基礎 基本原理 當用戶端創建遠端remotableclass的一個實例,.net框架在用戶端應用程式域中產生一個代理.該代理看起來就像實際物件.代理收到調用後,通過通道連接到遠端的物件 ...
- Windows Phone 7.1 Sensor プログラミング基礎
Windows Phone 7.1 Sensor プログラミング基礎 MSC D1-401セッションのフォローアップ第一弾です. この投稿では.Windows Phone 7.1 Mangoに搭載され ...
- 自行車基本知識 (zz)
一. 自行車基本知識 1.自行車發展簡史: //z 2017-02-08 18:03:05 L.326'21415 BG57IV3 T3795962035.K.F134211643 自行車的發展是一 ...
- 從turtle海龜動畫 學習 Python - 高中彈性課程系列 3 烏龜繪圖 所需之Python基礎
"Talk is cheap. Show me the code." ― Linus Torvalds 老子第41章 上德若谷 大白若辱 大方無隅 大器晚成 大音希聲 大象無形 道 ...
最新文章
- opencv图像旋转
- char (*p3)[5] = a; 和char (*p4)[5] = a;的区别?
- Ardino基础教程 1_让Arduino说出HelloWorld
- t检验的p值对照表_统计学|各类统计检验方法大汇总
- Stack Overflow 遭黑客入侵;中国首条 5G 覆盖地铁诞生;VS Code 1.34 发布!| 极客头条...
- 车牌识别及验证码识别的一般思路
- 在着手开发一款移动应用之前,我们需要考虑哪些因素?
- wireguard握手报文结构
- hdu 4318 Power transmission 临接表 广搜 多校联合赛(二) 第九题
- JetLinks 物联网基础平台 1.6 RELEASE 发布
- W3CSchool离线手册文档
- oracle和timesten整合,Timesten与Oracle SQL执行时间对比
- 使用 C# 写脚本的优势和方法
- 唤客猫SCRM功能详解(二)
- 2020UNCTF-MISC-网络深处1
- 如意云路由刷PandoraBox
- 用 FFMPEG 合并 MP4 视频
- 西瓜书第三章:LDA(及详细Fisher实现),QDA的python实现[仅代码实现]
- 布伦特原油期货为什么比纽约原油贵那么多
- 公司类型其他有限责任公司什么意思
热门文章
- Win10 Python yt-dlp下载youtube视频 | 安装使用详细教程
- L9170是一款DC双向马达驱动电路大输出电流5A原厂规格书资料
- OD Space Effect LOD Effect Poly Space Effects
- 将网页分享到微信JS
- 【java基础知识】集合类(含Collection类和Map类)
- LICEcap(GIF屏幕录制工具)简单使用说明
- 码农们的「血与泪」:新零售「全渠道中台」的前世今身
- Xilinx FPGA通过FLASH加载程序的时序
- 微信PC客户端无法发送图片,怎么解决?
- mklink 搜狗五笔输入法使用拼音输入法的颜文字工具