摘要:然而,這一行為在年的被修復(fù)了。在現(xiàn)代瀏覽器中,的值將不能被重寫我們需要支持或者更古老的瀏覽器怎么辦通常指令是安全的。都會計算得到另外一種選擇,你可以使用操作符安全地檢查是否已經(jīng)被賦值。雖然沒有被聲明,仍然會說他是。
眾所周知,當(dāng)聲明一個變量,并且沒有給賦值的情況下,它的初始值是 undefined。
但是在javascript中,怎么檢查一個值是否為 undefined 呢?
在現(xiàn)代瀏覽器中,你可以安全的直接比較將變量是與 undefined 進(jìn)行比較
if (name === undefined) { //... }
一些人反對直接使用 undefined 變量進(jìn)行比較,因為在舊的瀏覽器中它允許被重新賦值,像下面這樣:
undefined = "test"
在被重新賦值后,直接使用 undefined 將不能正確的檢測一個變量是否被賦值。
然而,這一行為在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 }.
undefined 的值是 undefined。這個屬性有不可寫,不可枚舉,不可配置的特性。
在現(xiàn)代瀏覽器中,undefined的值將不能被重寫
我們需要支持ie8或者更古老的瀏覽器怎么辦通常undefined指令是安全的。在應(yīng)用中并沒有什么理由需要修改undefined的值。
Thomas的回答使用具有說服力的推理,論證了這一點。
我沒有聽從人們告訴我,我不應(yīng)該使用setTimeout,因為有人可以(這樣用):
window.setTimeout = function () { alert("Got you now!"); };
下面一行,它可以重新定義參數(shù),替換原始值,使 raw === undefined 看起來是假的。
如果你仍然很在意,有兩個方法在即使全局 window.undefined 已經(jīng)被重寫的情況下,依然可以檢查一個值是否為 undefined。
if (name === void(0)) { //... }
在這個例子中 0 沒有任何實際意義,你想要使用 1 or function(){}也無所謂。 void(anything)都會計算得到undefiend
另外一種選擇,你可以使用typeof操作符安全地檢查是否已經(jīng)被賦值。你可以檢查一個值的類型是否為 "undefined" 代替與全局的 undefined 比較.
if (typeof name === "undefined") { //... }
注意第二個選擇與前一個方案稍微有點差異。雖然name沒有被聲明,typeof 仍然會說他是 undefined。如果你直接使用 name 與 undefinedor void(0)你會得到ReferenceError異常的錯誤.
但是不要直接使用void(0)在代碼中避免使用void(0)或者 typeof x === "undefined",這些表達(dá)式不是自解釋的,應(yīng)該包裝在isUndefined function函數(shù)中,像這樣:
function isUndefined(value){ //獲得undefined,保證它沒有被重新賦值 var undefined = void(0); return value === undefined; }
許多的工具庫已經(jīng)部署了這個方法,例如: _.isUndefined,underscore中的isUndefined方法
原文地址
原文標(biāo)題:在javascript中怎樣檢查undefiend
初次翻譯,如有錯誤,歡迎指正
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/80518.html
摘要:每次調(diào)用函數(shù)時,都會創(chuàng)建一個新的執(zhí)行上下文。理解執(zhí)行上下文和堆棧可以讓您了解代碼為什么要計算您最初沒有預(yù)料到的不同值的原因。 首發(fā):https://www.love85g.com/?p=1723 在這篇文章中,我將深入研究JavaScript最基本的部分之一,即執(zhí)行上下文。在這篇文章的最后,您應(yīng)該更清楚地了解解釋器要做什么,為什么在聲明一些函數(shù)/變量之前可以使用它們,以及它們的值是如何...
摘要:使用構(gòu)造函數(shù)的原型繼承相比使用原型的原型繼承更加復(fù)雜,我們先看看使用原型的原型繼承上面的代碼很容易理解。相反的,使用構(gòu)造函數(shù)的原型繼承像下面這樣當(dāng)然,構(gòu)造函數(shù)的方式更簡單。 五天之前我寫了一個關(guān)于ES6標(biāo)準(zhǔn)中Class的文章。在里面我介紹了如何用現(xiàn)有的Javascript來模擬類并且介紹了ES6中類的用法,其實它只是一個語法糖。感謝Om Shakar以及Javascript Room中...
摘要:搞懂的譯可能是初學(xué)的人最不關(guān)心的函數(shù),當(dāng)你意識到需要保持在其他函數(shù)中的上下文,實際上你需要的是。這就是問題所在。整合事件綁定和一個重大提高就是,和等等。然而,并沒有原生添加事件到多個節(jié)點的方式。能力有限,如有疑問,紕漏,速指出,感謝你 搞懂JavaScript的Function.prototype.bind[譯] Ben Howdle binding可能是初學(xué)Javascript的人最...
摘要:對進(jìn)行序列化和反序列化避免使用和構(gòu)造函數(shù)使用和構(gòu)造函數(shù)是非常昂貴的操作,因為每次他們都會調(diào)用腳本引擎將源代碼轉(zhuǎn)換成可執(zhí)行代碼。 原文:45 Useful JavaScript Tips, Tricks and Best Practices 譯文:45個有用的JavaScript技巧,竅門和最佳實踐 譯者:dwqs 在這篇文章中,我將分享一些JavaScript常用的技巧,竅門和最...
摘要:通常情況下,面向?qū)ο缶幊套屛覀兊靡员苊鈼l件式,并代之以繼承和多態(tài)。同時,使用條件式簡寫來表示值。因此,對于以這種方式編寫的代碼,你需要使用進(jìn)行編譯。 原文地址:Tips and Tricks for Better JavaScript Conditionals and Match Criteria 原文作者:Milos Protic 介紹 如果你像我一樣樂于見到整潔的代碼,那么你...
閱讀 3673·2021-09-30 09:59
閱讀 2343·2021-09-13 10:34
閱讀 585·2019-08-30 12:58
閱讀 1514·2019-08-29 18:42
閱讀 2210·2019-08-26 13:44
閱讀 2932·2019-08-23 18:12
閱讀 3326·2019-08-23 15:10
閱讀 1633·2019-08-23 14:37