一、列出7種數(shù)據(jù)類型(面試可能問)
二、undefined本質(zhì)
undefined是window對象的一個屬性,其類型是Undefined。
下面解釋javascript中屬性的本質(zhì),因為undefined是一個屬性,了解undefine的本質(zhì)要用到屬性的本質(zhì)。
三、屬性本質(zhì)
對JavaScript來說,屬性并非只是簡單的名稱和值,JavaScript用一組特征(attribute)來描述屬性(property)。
先來說第一類屬性,數(shù)據(jù)屬性。它比較接近于其它語言的屬性概念。數(shù)據(jù)屬性具有四個特征。
補(bǔ)充:第二類屬性是訪問器(getter/setter)屬性,它也有四個特征。 (本文用不到,但可以和第一類屬性放在一起記憶)
我們通常用于定義屬性的代碼會產(chǎn)生數(shù)據(jù)屬性,其中的writable、enumerable、configurable都默認(rèn)為true。我們可以使用內(nèi)置函數(shù) Object.getOwnPropertyDescripter來查看,如以下代碼所示:
const print = console.log const o = {a: 1} o.b = 2 // a和b均為數(shù)據(jù)屬性 const aa = Object.getOwnPropertyDescriptor(o, 'a') // {value: 1, writable: true, enumerable: true, configurable: true} const bb = Object.getOwnPropertyDescriptor(o, 'b') // {value: 2, writable: true, enumerable: true, configurable: true} print('aa', aa) print('bb', bb)
對window對象的undefined施加此函數(shù):
由此看出undefined是window的第一類屬性--數(shù)據(jù)屬性,而且該屬性不能能被賦值(writable=false),不能被for in枚舉(enumerable=false),不能刪除或改變特征值(configurable=false)。這也解釋為什么給undefined重新賦值后其值卻不改變:因為writable=false
以及解釋為什么不能重新用Object.defineProperty函數(shù)定義undefined:因為configurable=false
注:如果我們要想改變屬性的特征,或者定義訪問器屬性,我們可以使用 Object.defineProperty
四、Undefined與Null
一個問題,為什么有的編程規(guī)范要求用void 0代替undefined?現(xiàn)在我們就分別來看一下。
Undefined 類型表示未定義,它的類型只有一個值,就是 undefined。任何變量在賦值前是 Undefined 類型、值為 undefined,一般我們可以用全局變量undefined(就是名為undefined的這個變量)來表達(dá)這個值,或者 void 運(yùn)算來把任一一個表達(dá)式變成 undefined 值。
但是呢,因為JavaScript的代碼undefined是一個變量,而并非是一個關(guān)鍵字,這是JavaScript語言公認(rèn)的設(shè)計失誤之一,所以,為了避免無意中被篡改,建議使用 void 0 來獲取undefined值。
Undefined跟 null 有一定的表意差別,null表示的是:“定義了但是為空”。所以,在實(shí)際編程時,我們一般不會把變量賦值為 undefined,這樣可以保證所有值為 undefined 的變量,都是從未賦值的自然狀態(tài) 。
Null 類型也只有一個值,就是 null,它的語義表示空值,與 undefined 不同,null 是 JavaScript 關(guān)鍵字,所以在任何代碼中,你都可以放心用 null 關(guān)鍵字來獲取 null 值。
五、總結(jié)
undefined是window對象的一個屬性其類型是Undefined,屬性不是簡單的名值對,它還具有一組特征值(attribute)。通過Object.getOwnPropertyDescriptor函數(shù)可以得到這組特征值。通過Object.defineProperty函數(shù)可以添加一個自定義特征值的屬性,在已有屬性的特征值configurable為true的前提下也可以通過該函數(shù)修改已有屬性的特征值。
補(bǔ)充:undefined在全局環(huán)境沒法被賦值,在局部環(huán)境是可以被賦值的!
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com