摘要:又是啥是原始類型值之一,也是全局對象的屬性,在部分低級別的瀏覽器中可以被修改,在局部作用域中也可以被修改。所以常見的解決方法是在這個(gè)問題中提到用去替代標(biāo)簽的空屬性會減少頁面請求是否屬實(shí)有待考證結(jié)尾第一篇暫時(shí)寫完了,歡迎大家吐槽和提意見。
前言
原文鏈接
源碼地址
這是underscore.js源碼分析的第一篇文章,為什么選擇寫這篇文章呢?其實(shí)主要有兩點(diǎn)
下劃線源碼中通篇可見這樣的判斷obj === void 0,初次看這樣的寫法完全不知道什么意思,所以想整明白它。
決定寫一個(gè)系列把下劃線分析完整,希望由淺入深,柿子撿軟的捏,先從簡單的開始入手(?)
寫完這篇文章希望達(dá)到什么樣的效果呢?
說明白為什么用(void 0)代替undefined
(void 0)的一些簡單應(yīng)用
void 0是個(gè)啥void 0是個(gè)啥,為毛它可以直接代替undefined關(guān)鍵字來做判斷呢?我們可以看下mdn上的解釋
The void operator evaluates the given expression and then returns undefined.
void 運(yùn)算符 對給定的表達(dá)式進(jìn)行求值,然后返回 undefined
啥?去執(zhí)行了一段表達(dá)式,最后卻得到undefined,那要是表達(dá)式執(zhí)行的結(jié)果是2、3、8、毛主席萬歲,也是返回undefined嗎?答案是:對的。他就是這么個(gè)東西,不管你表達(dá)式里寫的是個(gè)啥,我最后就是給你個(gè)undefined。
undefined又是啥undefined是js原始類型值之一,也是全局對象window的屬性,在部分低級別的瀏覽器中可以被修改,在局部作用域中也可以被修改。
首先我們來看這一段斷碼
var undefined = "qianlongo" alert(undefined)
最后console出來的是啥呢?undefined : qianlongo,
沒圖你說個(gè)js,接下來截取部分瀏覽器運(yùn)行后的截圖
ie7
ie8
ie9
測試結(jié)果為undefined
ie10
chrome
在最新的版本58.0.3029.81測試結(jié)果為undefined
firefox
在最新的版本52.0.2測試結(jié)果為undefined
歐朋瀏覽器
在最新的版本39.0.2256.48測試結(jié)果為undefined
你看ie老版本中就是那么任性,在全局作用域中可以直接改寫undefined,也就是說當(dāng)你想知道一個(gè)變量是不是等于undefined的時(shí)候直接這樣判斷已經(jīng)不安全了。
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,是有風(fēng)險(xiǎn)的。
if (obj === undefined) { // xxx }為啥要用void 0來代替undefined
為啥要用void 0來代替undefined,基于以上介紹,原因就在這里了,void 0無論何時(shí)何地,后面跟了什么,結(jié)果都得到undefined,這正好是我們需要的。所以將上面的判斷改寫一下
當(dāng)然了還要另一個(gè)原因void 0 比undefined短
if (obj === void 0) { // xxx }void 0的一些其他應(yīng)用
填充a標(biāo)簽的href
xxxx
上面這段代碼使用一個(gè)#號來填充a標(biāo)簽的href屬性,這其實(shí)是有一些弊端的,比如用戶點(diǎn)擊的時(shí)候,頁面會回到頂部(網(wǎng)上有人說會刷新頁面,但是自己試了好像不會),試想我好不容易滾啊滾啊滾到xxxx這幾個(gè)文字的地方,一不留神手賤點(diǎn)了一下,瞬間頁面又回到頂部了,是不是要哭死?。
所以常見的解決方法是
xxxx
What"s the valid way to include an image with no src?,在這個(gè)問題中提到用void 0去替代image標(biāo)簽的空src屬性會減少頁面請求(是否屬實(shí)有待考證)
結(jié)尾第一篇暫時(shí)寫完了,歡迎大家吐槽和提意見。
參考文章鏈接:
What does “javascript:void(0)” mean?
difference between “void 0 ” and “undefined”
void operator
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/111987.html
摘要:又是啥是原始類型值之一,也是全局對象的屬性,在部分低級別的瀏覽器中可以被修改,在局部作用域中也可以被修改。所以常見的解決方法是在這個(gè)問題中提到用去替代標(biāo)簽的空屬性會減少頁面請求是否屬實(shí)有待考證結(jié)尾第一篇暫時(shí)寫完了,歡迎大家吐槽和提意見。 前言 原文鏈接 源碼地址 這是underscore.js源碼分析的第一篇文章,為什么選擇寫這篇文章呢?其實(shí)主要有兩點(diǎn) 下劃線源碼中通篇可見這樣的判斷...
摘要:由構(gòu)造函數(shù)返回的對象就是表達(dá)式的結(jié)果。如果構(gòu)造函數(shù)沒有顯式返回一個(gè)對象,則使用步驟創(chuàng)建的對象。運(yùn)算符返回一個(gè)布爾值,表示對象是否為某個(gè)構(gòu)造函數(shù)的實(shí)例。 面向?qū)ο?本人能力有限,有誤請斧正 本文旨在復(fù)習(xí)面向?qū)ο?不包含es6) 本文學(xué)習(xí)思維 創(chuàng)建對象的方式,獲取對象屬性 構(gòu)造函數(shù),構(gòu)造函數(shù)的new 做了什么 原型與原型對象 原型鏈 繼承(借用構(gòu)造繼承、原型繼承、組合繼承、寄生組合繼承)...
摘要:但縱使如此,我也要技術(shù)這條路上一路走到黑。接下來你想不想一起看下下劃線是怎么實(shí)現(xiàn)的。這個(gè)迭代傳遞個(gè)參數(shù)和迭代的或者和最后一個(gè)引用的整個(gè)是從右側(cè)開始組合的元素的函數(shù)使用案例我們來看一下上面的執(zhí)行過程是怎樣的。希望這篇文章對大家有點(diǎn)作用。 前言 underscore.js源碼分析第三篇,前兩篇地址分別是 那些不起眼的小工具? (void 0)與undefined之間的小九九 本篇原文鏈接 ...
摘要:但縱使如此,我也要技術(shù)這條路上一路走到黑。接下來你想不想一起看下下劃線是怎么實(shí)現(xiàn)的。這個(gè)迭代傳遞個(gè)參數(shù)和迭代的或者和最后一個(gè)引用的整個(gè)是從右側(cè)開始組合的元素的函數(shù)使用案例我們來看一下上面的執(zhí)行過程是怎樣的。希望這篇文章對大家有點(diǎn)作用。 前言 underscore.js源碼分析第三篇,前兩篇地址分別是 那些不起眼的小工具? (void 0)與undefined之間的小九九 本篇原文鏈接 ...
閱讀 3414·2021-10-08 10:15
閱讀 5628·2021-09-23 11:56
閱讀 1479·2019-08-30 15:55
閱讀 456·2019-08-29 16:05
閱讀 2739·2019-08-29 12:34
閱讀 2052·2019-08-29 12:18
閱讀 925·2019-08-26 12:02
閱讀 1661·2019-08-26 12:00