原文連接javascript
源碼地址java
這是underscore.js源碼分析的第一篇文章,爲何選擇寫這篇文章呢?其實主要有兩點 git
obj === void 0
,初次看這樣的寫法徹底不知道什麼意思,因此想整明白它。寫完這篇文章但願達到什麼樣的效果呢?github
說明白爲何用(void 0)代替undefinedchrome
(void 0)的一些簡單應用express
void 0是個啥,爲毛它能夠直接代替undefined關鍵字來作判斷呢?咱們能夠看下mdn上的解釋瀏覽器
The void operator evaluates the given expression and then returns undefined.安全
void 運算符 對給定的表達式進行求值,而後返回 undefined
源碼分析
啥?去執行了一段表達式,最後卻獲得undefined,那要是表達式執行的結果是二、三、八、毛主席萬歲,也是返回undefined嗎?答案是:對的。他就是這麼個東西,無論你表達式裏寫的是個啥,我最後就是給你個undefined。測試
undefined是js原始類型值之一,也是全局對象window的屬性,在部分低級別的瀏覽器中能夠被修改,在局部做用域中也能夠被修改。
首先咱們來看這一段斷碼
var undefined = 'qianlongo'
alert(undefined)複製代碼
最後console出來的是啥呢?undefined
: qianlongo
,
沒圖你說個js,接下來截取部分瀏覽器運行後的截圖
ie7
ie8
ie9
測試結果爲undefined
ie10
chrome
在最新的版本58.0.3029.81測試結果爲undefined
firefox
在最新的版本52.0.2測試結果爲undefined
歐朋瀏覽器
在最新的版本39.0.2256.48測試結果爲undefined
你看ie老版本中就是那麼任性,在全局做用域中能夠直接改寫undefined,也就是說當你想知道一個變量是否是等於undefined的時候直接這樣判斷已經不安全了。
if (obj === undefined) {
// xxx
}複製代碼
接下來咱們再看一段js
var testUndefined = function () {
var obj = {}
var undefined = 'underscore'
var window = {
'undefined': 'qianlongo'
}
console.log(window) // {'undefined': 'qianlongo'}
console.log(undefined) // underscore
console.log(window.undefined) // qianlongo
console.log(obj.name === undefined) // false
console.log(obj.name === window.undefined) // false
console.log(obj.name === (void 0)) // true
}
testUndefined()複製代碼
能夠得出,window,undefined自己在局部做用域中是能夠被重寫掉的,一樣的道理,若是你在局部做用域中一樣用如下代碼來判斷obj是否是undefined,是有風險的。
if (obj === undefined) {
// xxx
}複製代碼
爲啥要用void 0來代替undefined,基於以上介紹,緣由就在這裏了,void 0不管什麼時候何地,後面跟了什麼,結果都獲得undefined,這正好是咱們須要的。因此將上面的判斷改寫一下
固然了還要另外一個緣由void 0 比undefined短
if (obj === void 0) {
// xxx
}複製代碼
<div style="height: 10000px;"></div>
<a href="#">xxxx</a>
<script>
console.log('xxxx')
</script>複製代碼
上面這段代碼使用一個#號來填充a標籤的href屬性,這實際上是有一些弊端的,好比用戶點擊的時候,頁面會回到頂部(網上有人說會刷新頁面,可是本身試了好像不會),試想我好不容易滾啊滾啊滾到xxxx這幾個文字的地方,一不留神手賤點了一下,瞬間頁面又回到頂部了,是否是要哭死😭。
因此常見的解決方法是
<div style="height: 10000px;"></div>
<a href="javascript:void(0)">xxxx</a>
<script>
console.log('xxxx')
</script>複製代碼
第一篇暫時寫完了,歡迎你們吐槽和提意見。
參考文章連接:
What does 「javascript:void(0)」 mean?