探索JavaScript中Null和Undefined的深淵
本文翻譯自:
https://modernweb.com/exploring-the-abyss-of-null-and-undefined-in-javascript/
在討論JavaScript中的原始資料型別時,大多數人都了解基本知識,從String,Number和Boolean開始,這些原語非常簡單,可以像您期望的那樣起作用,但是,本文將重點介紹稱為Null和Undefined的更獨特的原始資料型別,是什么使它們相似,不相似以及總體上與眾不同,
了解 null 和 undefined
在JavaScript中,null是語言關鍵字,不代表可識別的物件值,換句話說,這表示“沒有值”,雖然相似,但undefined實際上表示值不存在,兩者都是完全不變的,沒有屬性或方法,并且無法進行屬性分配,實際上,嘗試訪問或定義屬性會引發TypeError,顧名思義,它們完全沒有值,
值的缺失導致它們被描述為虛假值,這意味著當它們在條件(如if陳述句)的背景關系中使用時,它們的值為假,使用相等運算子(==)將這兩個虛假值與其他虛假值進行比較,可以發現它們除了自身之外不等于其他任何值:
null == 0; // false
undefined == ""; // false
null == false; // false
undefined == false; // false
null == undefined; // true
盡管有此與其他相似之處,null 和 undefined并不等效,每個都充當其自己獨特型別的唯一成員;undefined是型別的未定義和null型別為空,將二者與值和型別均等的嚴格相等運算子(===)進行比較就足以證明:
undefined === null; // false
這是一個重要的區別; 兩者都有不同的目的,這樣做是合理的,為了區分兩者,您可能希望將其undefined視為代表值的意外缺失和null代表預期的值缺失,
屈服 undefined
undefined在代碼中產生值的方法有很多種,嘗試訪問不存在值的值時通常會遇到此問題,在這種情況下,JavaScript是一種動態的,弱型別的語言,它將僅默認為一個undefined值,而不會引發錯誤,
任何未提供初始值的已宣告變數將具有默認值undefined:
var foo; // defaults to undefined
undefined嘗試訪問不存在的物件屬性或陣列項時,將發出一個值:
var array = [1, 2, 3];
var foo = array.foo; // foo property doesn't exist, returns undefined
var item = array[5]; // no item exists in the array at index 5, returns undefined
如果函式中省略了return陳述句,undefined則回傳:
var value = (function(){})(); // returns undefined
未提供給函式呼叫的undefined引數:
(function(undefined){
// parameter is undefined
})();
該void 0還可以用來回傳一個undefined值,諸如Underscore之類的庫將其用作型別檢查的防彈手段,因為它是不可變的,undefined在任何情況下都可以依賴于回傳:
function isUndefined(obj){
return obj === void 0;
}
最后,undefined是一個預定義的全域變數(不是類似的關鍵字null),它已初始化為以下undefined值:
'undefined' in window; // true
從ECMAScript 5開始,此變數是只讀的,以前不是這種情況,
null 實體
用例null是將其區分的主要方面,因為與相比undefined,null它被視為更多的分配值,這就是為什么typeof運算子與值一起使用時回傳“物件”的原因null,最初的理由是,null過去和現在通常用作需要物件的空參考,非常類似于占位符,typeof此后,與之相關的這種行為已被識別為錯誤,盡管已提出糾正建議,但出于向后兼容的目的,到目前為止,該行為未更改,
這就是JavaScript環境從不將值設定為的原因null,它必須以編程方式完成,正如有關MDN的檔案所述:
在API中,null通常是在可以期望有物件但沒有物件相關的地方進行檢索,
對于DOM來說確實如此,它是獨立于語言的,并且不屬于ECMAScript規范的范圍,由于它是一個外部API,因此嘗試檢索不存在的元素會回傳一個null值,而不是undefined,
通常,如果您需要為變數或屬性分配非值,將其傳遞給函式或從函式回傳,null則幾乎總是最佳選擇,
另一個可行的用例null也被認為是良好實踐,object = null當不再需要參考時,顯式變數無效,通過分配一個null值,您可以有效地清除參考,并假定未在代碼的其他位置參考該物件,將其指定為垃圾回收,從而回收記憶體,
深層發掘
是什么讓null和undefined這樣的黑洞不僅僅是在他們的行為,而且在方式,他們在內部JavaScript環境中進行處理,它們似乎不具有通常與其他圖元或內置物件關聯的相同特征,
作為ES5的,該Object.prototype.toString方法,這已成為進行型別檢查的事實標準,被證明是在這方面兩者一致的null和undefined:
Object.prototype.toString.call(null); // [object Null]
Object.prototype.toString.call(undefined); // [object Undefined]
但是,該Object.prototype.toString方法實際上并沒有檢索建構式的內部[[Class]]屬性null或undefined公開其建構式,根據檔案,呼叫時將采取以下步驟:
If the this value is undefined, return "[object Undefined]".
If the this value is null, return "[object Null]".
Let O be the result of calling ToObject passing the this value as the argument.
Let class be the value of the [[Class]] internal property of O.
Return the String value that is the result of concatenating the three Strings "[object ", class, and "]".
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255999.html
標籤:AI
