JavaScript定義變量和變量優(yōu)先級(jí)問題探討
看下面的代碼:
if (!("aa" in window)) {
alert('oh my god');
var aa = 1;
}
alert("aa" in window);
alert(aa);
回答以下問題:
會(huì)報(bào)錯(cuò)嗎?會(huì)彈出幾次?
第2個(gè)alert是true還是false?
第3個(gè)alert彈出什么?
為什么?
思考下,然后測(cè)試下,如果你回答正確,那么后面的文章就不用看了。
-----------------------------
在JS里定義變量太簡單了,直接一個(gè)var ,甚至不用var都可以:
var a = 1;
這里a就是變量名,1就是變量值。唉,這個(gè)太基礎(chǔ)了??聪旅娴拇a:
var a;
alert(a);
以firebug測(cè)試,會(huì)彈出undefined,這個(gè)是大家很熟悉的一個(gè)字符串了,貌似表示變量未定義。但我覺得,我已經(jīng)var了啊,這就是定義了嘛,只是沒有附值而已。
我們來個(gè)真正的沒有定義的:
alert(a);
沒錯(cuò),就是直接alert一個(gè)根本沒有出現(xiàn)過的變量,這會(huì)如何?
firebug直接報(bào)錯(cuò)了:a is not defined.意思是a沒有定義。這個(gè)結(jié)合前面的代碼來看,讓人困惑。這個(gè)沒有定義和前面的未定義有什么不同呢?
其實(shí)前面的代碼等價(jià)于這樣的:
var a = undefined;
alert(a);
也就是說,當(dāng)聲明變量而不賦值時(shí),JS會(huì)給變量傳一個(gè)undefined值,注意,這是個(gè)“值”,說明a已經(jīng)有值了,這個(gè)值就叫“未定義”。
而后面的直接alert,變量從沒有出現(xiàn)過,也就是說這才是真正的未定義。
簡單的說:JS中不存在沒有值的變量,變量聲明的時(shí)候就賦值了。
然后我們看下面的代碼:
alert(a);
var a = 1;
這個(gè)代碼會(huì)報(bào)錯(cuò)嗎?因?yàn)樵赼lert的時(shí)候變量a還沒來得及出現(xiàn)呀。
但是這樣居然沒有報(bào)錯(cuò),而是彈出了undefined值。表明變量a已經(jīng)存在了,只是值卻不是我們想要的,而是undefined。這又是個(gè)什么問題呢?
因?yàn)関ar 變量聲明和函數(shù)聲明一樣,會(huì)提前,其實(shí)上面的代碼是這樣的:
var a;
alert(a);
a = 1;
這么一來就懂了。
所以,這個(gè)問題的關(guān)鍵在于:var 聲明會(huì)提前到作用域頂端,但附值卻不會(huì)———好糾結(jié)的設(shè)定,不知道為什么要這么搞。個(gè)人覺得這是JS的一個(gè)缺陷。
現(xiàn)在有一種代碼習(xí)慣,主張把變量聲明一律放在作用域前方,大概就是考慮到這個(gè)——反正就算你不寫在前方,JS也會(huì)提前到前方。
現(xiàn)在放出文首問題的答案:
只會(huì)彈出兩個(gè)alert,而if里面的alert不會(huì)執(zhí)行,因?yàn)関ar聲明的提前性,導(dǎo)致真正的代碼是這個(gè)樣子:
var aa;
if (!("aa" in window)) {
alert('oh my god');
aa = 1;
}
alert("aa" in window);
alert(aa);
雖然aa為空,但用'aa' in window判斷時(shí)會(huì)為真,因?yàn)閍確實(shí)存在了,而值是undefined。所以if代碼不會(huì)執(zhí)行。后面兩個(gè)alert我就不說了。
個(gè)人感覺這是一個(gè)很無厘頭的問題,我們應(yīng)該了解他的原因,但鄙視他這種陷阱。
上面這個(gè)問題也是我寫這篇文章的緣由,這段代碼是我從一篇網(wǎng)文里看到的,但他里面沒有答案,我百撕不得騎姐,跑到stackoverflow上去問了才搞清楚。答案就是這篇文章。
但這是很基礎(chǔ)的問題啊其實(shí)?。?!
哈哈,原諒我,后面還有一個(gè)問題:
var b = {}
alert(b.aa);
alert(b.aa.bb);
這也是一種聲明變量的方式,那么,這段代碼會(huì)報(bào)錯(cuò)嗎?為什么?
- js利用與或運(yùn)算符優(yōu)先級(jí)實(shí)現(xiàn)if else條件判斷表達(dá)式
- 淺談JS運(yùn)算符&&和|| 及其優(yōu)先級(jí)
- 淺談JavaScript中運(yùn)算符的優(yōu)先級(jí)
- Javascript算符的優(yōu)先級(jí)介紹
- 淺析JavaScript中的同名標(biāo)識(shí)符優(yōu)先級(jí)
- JS前端知識(shí)點(diǎn) 運(yùn)算符優(yōu)先級(jí),URL編碼與解碼,String,Math,arguments操作整理總結(jié)
- JS正則表達(dá)式大全(整理詳細(xì)且實(shí)用)
- JS運(yùn)算符優(yōu)先級(jí)與表達(dá)式示例詳解
相關(guān)文章
Express實(shí)現(xiàn)前端后端通信上傳圖片之存儲(chǔ)數(shù)據(jù)庫(mysql)傻瓜式教程(二)
這篇文章主要介紹了Express實(shí)現(xiàn)前端后端通信上傳圖片之存儲(chǔ)數(shù)據(jù)庫(mysql)傻瓜教程(二)的相關(guān)資料,需要的朋友可以參考下2015-12-12
前端內(nèi)網(wǎng)開發(fā)npm安裝的幾種方法小結(jié)
這篇文章主要介紹了如何在不聯(lián)網(wǎng)或離線環(huán)境下安裝npm依賴,文中通過代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2025-01-01
js實(shí)現(xiàn)一款簡單踩白塊小游戲(曾經(jīng)很火)
本文給大家分享原生js實(shí)現(xiàn)曾經(jīng)很火的一款小游戲—?jiǎng)e踩白塊,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-12-12
JS操作input標(biāo)簽屬性checkbox全選的實(shí)現(xiàn)代碼
這篇文章主要介紹了JS操作input標(biāo)簽屬性checkbox全選的代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03
js對(duì)url進(jìn)行編碼解碼的三種方式總結(jié)
為一個(gè)字符串進(jìn)行URL編碼很容易,只需要調(diào)用encodeURI,傳入要編碼的字符串即可,而且實(shí)現(xiàn)的方法不止這一個(gè),下面這篇文章主要給大家介紹了關(guān)于js對(duì)url進(jìn)行編碼解碼的三種方式,需要的朋友可以參考下2023-02-02
Javascript中判斷變量是數(shù)組還是對(duì)象(array還是object)
怎樣判斷一個(gè)JavaScript變量是array還是obiect,或許有很多初學(xué)者對(duì)此不是很清楚吧,下面為大家詳細(xì)解答下,希望對(duì)大家有所幫助2013-08-08
JS模仿手機(jī)端九宮格登錄功能實(shí)現(xiàn)代碼
這篇文章主要介紹了JS模仿手機(jī)端九宮格登錄功能實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-04-04
uni-file-picker文件選擇上傳功能實(shí)現(xiàn)代碼
本文介紹了uni-file-picker的基礎(chǔ)使用方法,包括選擇圖片的九宮格樣式、限制選擇的圖片數(shù)量、指定圖片類型及后綴,以及如何自定義上傳時(shí)機(jī),詳細(xì)說明了如何通過設(shè)置不同的屬性來實(shí)現(xiàn)圖片的選擇和上傳,適用于需要在應(yīng)用中上傳圖片的開發(fā)者2024-09-09

