Javascript中判斷一個(gè)值是否為undefined的方法詳解
前言
相信大家都知道當(dāng)聲明一個(gè)變量,并且沒(méi)有給賦值的情況下,它的初始值是undefined。但是在javascript中,怎么檢查一個(gè)值是否為undefined呢?
簡(jiǎn)單來(lái)說(shuō),在現(xiàn)代瀏覽器中,你可以安全的比較變量是否為undefined
if (name === undefined) {...}
一些人反對(duì)直接使用undefined變量進(jìn)行比較,因?yàn)樵谂f的瀏覽器中允許它的值被重新賦值,比如下面這樣:
undefined = "test"
在被重新賦值后,使用undefined指令將不能正確的檢測(cè)一個(gè)變量是否被賦值。
不過(guò),這個(gè)行為在2009年的ECMAScript 5被修復(fù)了。
15.1.1.3 undefined The value of undefined is undefined (see 8.1). This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
在現(xiàn)代瀏覽器中,undefined的值將不能被重寫(xiě)
我們需要支持IE8或者更古老的瀏覽器怎么辦
通常undefined指令是安全的。在應(yīng)用中并沒(méi)有什么理由需要修改undefined的值。
Thomas的回答使用具有說(shuō)服力的推理,論證了這一點(diǎn)。
I don't hear people telling me that I shouldn't use setTimeout because someone can 我不聽(tīng)別人告訴我,我不應(yīng)該使用setTimeout,因?yàn)橛械娜讼襁@樣用:
window.setTimeout = function () { alert("Got you now!"); };
下面一行,“它可以被重新賦值”,raw === undefined
返回false
如果你仍然很在意,有兩個(gè)方法可以檢查一個(gè)值是否為undefined,即使全局window.undefined
已經(jīng)被重寫(xiě)
if (name === void(0)) {...}
在這個(gè)例子中0沒(méi)有任何實(shí)際意義,你想要使用 1 or function(){}
也無(wú)所謂。 void(anything)
都會(huì)計(jì)算得到undefiend
另外一種選擇,你可以使用typeof操作符安全地檢查是否已經(jīng)被賦值。你可以檢查一個(gè)值的類(lèi)型是否為”undefined”代替與全局的undefined比較.
if (typeof name === "undefined") {...}
注意第二個(gè)選擇與前一個(gè)方案稍微有點(diǎn)差異.盡管name沒(méi)有被聲明,typeof會(huì)返回他是undefined。如果你直接使用name與undefinedor void(0)
你會(huì)得到ReferenceError
異常的錯(cuò)誤.
但是不要使用VOID(0)指令
在代碼中避免使用void(0)或者 typeof x === "undefined"
,你可以使用isUndefined function
方法把他們包起來(lái),這樣你使用的時(shí)候就不用再特意說(shuō)明了.
function isUndefined(value){ //獲得undefined,保證它沒(méi)有被重新賦值 var undefined = void(0); return value === undefined; }
一些工具庫(kù)已經(jīng)部署了這個(gè)方法,例如: _.isUndefined
,underscore
中的isUndefined
方法
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望能對(duì)大家的學(xué)習(xí)或者工作帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
相關(guān)文章
JavaScript 類(lèi)型轉(zhuǎn)換的詳細(xì)實(shí)現(xiàn)
本文主要介紹了JavaScript 類(lèi)型轉(zhuǎn)換的詳細(xì)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02將CKfinder整合進(jìn)CKEditor3.0的新方法
最新發(fā)布的CKFinder 1.4版 已經(jīng)提供了對(duì)CKEditor3.0的支持2010-01-01js實(shí)現(xiàn)mp3錄音通過(guò)websocket實(shí)時(shí)傳送+簡(jiǎn)易波形圖效果
這篇文章主要介紹了js實(shí)現(xiàn)mp3錄音通過(guò)websocket實(shí)時(shí)傳送+簡(jiǎn)易波形圖效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06TypeError document.getElementById(...) is null錯(cuò)誤原因
這篇文章主要介紹了TypeError document.getElementById(...) is null錯(cuò)誤原因,這是很容易犯的一個(gè)低級(jí)錯(cuò)誤,需要的朋友可以參考下2015-05-05詳解layui?laydate選擇時(shí)間的回調(diào)方法
這篇文章主要介紹了layui?laydate選擇時(shí)間的回調(diào)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01JavaScript setInterval()與setTimeout()計(jì)時(shí)器
這篇文章主要介紹了JavaScript setInterval()與setTimeout()計(jì)時(shí)器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12javascript簡(jiǎn)易緩動(dòng)插件(源碼打包)
最近,同事在做一個(gè)項(xiàng)目的時(shí)候,有個(gè)需求,需要一款動(dòng)畫(huà)庫(kù)來(lái)支持2012-02-02