javascript中undefined的本質(zhì)解析
一、列出7種數(shù)據(jù)類型(面試可能問(wèn))
- Undefined
- Null
- Boolean
- String
- Number
- Symbol
- Object
二、undefined本質(zhì)
undefined是window對(duì)象的一個(gè)屬性,其類型是Undefined。

下面解釋javascript中屬性的本質(zhì),因?yàn)閡ndefined是一個(gè)屬性,了解undefine的本質(zhì)要用到屬性的本質(zhì)。
三、屬性本質(zhì)
對(duì)JavaScript來(lái)說(shuō),屬性并非只是簡(jiǎn)單的名稱和值,JavaScript用一組特征(attribute)來(lái)描述屬性(property)。
先來(lái)說(shuō)第一類屬性,數(shù)據(jù)屬性。它比較接近于其它語(yǔ)言的屬性概念。數(shù)據(jù)屬性具有四個(gè)特征。
- value:就是屬性的值。
- writable:決定屬性能否被賦值。
- enumerable:決定for in能否枚舉該屬性。
- configurable:決定該屬性能否被刪除或者改變特征值。
補(bǔ)充:第二類屬性是訪問(wèn)器(getter/setter)屬性,它也有四個(gè)特征。 (本文用不到,但可以和第一類屬性放在一起記憶)
- getter:函數(shù)或undefined,在取屬性值時(shí)被調(diào)用。
- setter:函數(shù)或undefined,在設(shè)置屬性值時(shí)被調(diào)用。
- enumerable:決定for in能否枚舉該屬性。
- configurable:決定該屬性能否被刪除或者改變特征值。
我們通常用于定義屬性的代碼會(huì)產(chǎn)生數(shù)據(jù)屬性,其中的writable、enumerable、configurable都默認(rèn)為true。我們可以使用內(nèi)置函數(shù) Object.getOwnPropertyDescripter來(lái)查看,如以下代碼所示:
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)

對(duì)window對(duì)象的undefined施加此函數(shù):

由此看出undefined是window的第一類屬性--數(shù)據(jù)屬性,而且該屬性不能能被賦值(writable=false),不能被for in枚舉(enumerable=false),不能刪除或改變特征值(configurable=false)。這也解釋為什么給undefined重新賦值后其值卻不改變:因?yàn)閣ritable=false

以及解釋為什么不能重新用Object.defineProperty函數(shù)定義undefined:因?yàn)閏onfigurable=false

注:如果我們要想改變屬性的特征,或者定義訪問(wèn)器屬性,我們可以使用 Object.defineProperty

四、Undefined與Null
一個(gè)問(wèn)題,為什么有的編程規(guī)范要求用void 0代替undefined?現(xiàn)在我們就分別來(lái)看一下。

Undefined 類型表示未定義,它的類型只有一個(gè)值,就是 undefined。任何變量在賦值前是 Undefined 類型、值為 undefined,一般我們可以用全局變量undefined(就是名為undefined的這個(gè)變量)來(lái)表達(dá)這個(gè)值,或者 void 運(yùn)算來(lái)把任一一個(gè)表達(dá)式變成 undefined 值。
但是呢,因?yàn)镴avaScript的代碼undefined是一個(gè)變量,而并非是一個(gè)關(guān)鍵字,這是JavaScript語(yǔ)言公認(rèn)的設(shè)計(jì)失誤之一,所以,為了避免無(wú)意中被篡改,建議使用 void 0 來(lái)獲取undefined值。
Undefined跟 null 有一定的表意差別,null表示的是:“定義了但是為空”。所以,在實(shí)際編程時(shí),我們一般不會(huì)把變量賦值為 undefined,這樣可以保證所有值為 undefined 的變量,都是從未賦值的自然狀態(tài) 。
Null 類型也只有一個(gè)值,就是 null,它的語(yǔ)義表示空值,與 undefined 不同,null 是 JavaScript 關(guān)鍵字,所以在任何代碼中,你都可以放心用 null 關(guān)鍵字來(lái)獲取 null 值。
五、總結(jié)
undefined是window對(duì)象的一個(gè)屬性其類型是Undefined,屬性不是簡(jiǎn)單的名值對(duì),它還具有一組特征值(attribute)。通過(guò)Object.getOwnPropertyDescriptor函數(shù)可以得到這組特征值。通過(guò)Object.defineProperty函數(shù)可以添加一個(gè)自定義特征值的屬性,在已有屬性的特征值configurable為true的前提下也可以通過(guò)該函數(shù)修改已有屬性的特征值。
補(bǔ)充:undefined在全局環(huán)境沒法被賦值,在局部環(huán)境是可以被賦值的!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 處理JavaScript值為undefined的7個(gè)小技巧
- JavaScript undefined及null區(qū)別實(shí)例解析
- JavaScript中的null和undefined用法解析
- JS在Chrome瀏覽器中showModalDialog函數(shù)返回值為undefined的解決方法
- Javascript類型系統(tǒng)之undefined和null淺析
- javascript類型系統(tǒng)——undefined和null全面了解
- Javascript基礎(chǔ)_簡(jiǎn)單比較undefined和null 值
- JavaScript必知必會(huì)(二) null 和undefined
- 辨析JavaScript中的Undefined類型與null類型
- JavaScript之不可靠的undefined
相關(guān)文章
javascript 判斷當(dāng)前瀏覽器版本并判斷ie版本
這篇文章主要介紹了javascript 判斷當(dāng)前瀏覽器版本并判斷ie版本的相關(guān)資料,需要的朋友可以參考下2017-02-02
JS簡(jiǎn)單生成由字母數(shù)字組合隨機(jī)字符串示例
這篇文章主要介紹了JS簡(jiǎn)單生成由字母數(shù)字組合隨機(jī)字符串,結(jié)合實(shí)例形式分析了javascript使用Math.random()生成隨機(jī)字符串相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
D3.js中data(), enter() 和 exit()的問(wèn)題詳解
相信大多數(shù)人對(duì)D3.js并不陌生。這是一個(gè)由紐約時(shí)報(bào)可視化編輯 Mike Bostock與他斯坦福的教授和同學(xué)合作開發(fā)的數(shù)據(jù)文件處理的JavaScript Library,全稱叫做Data-Driven Documents,在d3.js中data(), enter() 和 exit()比較常見,下面給大家就這方面的知識(shí)給大家詳解2015-08-08
layui的布局和表格的渲染以及動(dòng)態(tài)生成表格的方法
今天小編就為大家分享一篇layui的布局和表格的渲染以及動(dòng)態(tài)生成表格的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09

