在JavaScript系列-----Object之基於Hash<Key,Value>存儲之Key篇 (1)中,咱們推理出:對象是以Hash結構存儲的,對象的屬性被表示爲多個<Key,Value>鍵值對。html
其中,Key的數據類型是字符串,可是,咱們並無說Value是以什麼數據結構存儲的,在本文中,咱們將繼續討論:Value的存儲類型-----博文的核心數據結構
既然在JavaScript中,對象的屬性是以鍵值對的形式存儲的,那麼咱們知道必須須要知道對象屬性的三種類型:dom
咱們用一個例子來分別說明這三種屬性類型:函數
var person = {}; person.name = '張三'; //第一種,基本數據類型屬性 person.age = 18; peron.getName = function () { //第二種,引用數據類型的屬性,由於在js中函數也是對象 return this.name; } Object.defineProperty(person, 'isAdult', { //第三種,訪問器屬性 get: function () { if (person.age >= 18) { return true; } else { return false; } } }); console.log(person.isAdult); //true
經過上例,咱們認識到三種屬性類型後,那麼,接下來咱們來談談Value是怎麼表示這三種屬性的!post
在JavaScript高級程序設計(第三版)中,是這麼描素屬性的:屬性在建立時都帶有一些特徵值,JavaScript引擎經過這些特徵值來定義他們的行爲。this
下面,分別討論這三種屬性分別用哪些特徵值來描述: spa
(1).基本數據類型的屬性設計
var person = {}; person.name = '張三'; var descriptor=Object.getOwnPropertyDescriptor(person,"name"); console.log(descriptor); //輸出結果:
configurable
|
true |
enumerable
|
true |
value
|
"張三" |
writable
|
true |
(2).引用數據類型的屬性 指針
var person = {}; person.getName = function () { return this.name; }
person.child={name:"張四"}; var descriptor = Object.getOwnPropertyDescriptor(person, 'getName'); console.log(descriptor); //輸出結果:
configurable
|
true |
enumerable
|
true |
writable
|
true |
value
|
function() |
var descriptor1 = Object.getOwnPropertyDescriptor(person, 'child');
console.log(descriptor1); //輸出結果:
configurable
|
true |
enumerable
|
true |
value
|
Object { name="張四"} |
writable
|
true |
(3).訪問器類型的屬性code
var person = {}; Object.defineProperty(person, 'isAdult', { get: function () { if (person.age >= 18) { return true; } else { return false; } } }); var descriptor=Object.getOwnPropertyDescriptor(person,"isAdult"); console.log(descriptor); //輸出結果:
configurable
|
false |
enumerable
|
false |
set
|
undefined |
get
|
function() |
從上面三個例子能夠看書,Value也是用一對對<Key,Value>表示的一個結構體。固然,咱們也能夠將Value看作一個對象,由於對象原本就是結構體。
那麼,問題的答案就顯而易見了:
對象是以Hash結構存儲的,用<Key,Value>鍵值對錶示對象的屬性,Key的數據類型爲字符串,Value的數據類型是結構體,即對象是以<String,Object>類型的HashMap結構存儲的。
(1)數據類型的特性(基本數據類型屬性和引用數據類型屬性)
從第二部分咱們能夠看出,數據類型的屬性的特性值有四個:
特性 | 數據類型 | 意義 |
configurable | boolean | 表示可否修改此屬性特性,爲false時,此屬性不能刪除(針對delete),且不能修改 |
enumerable | booelan | 表示此屬性是否能被枚舉,爲false時,不能被枚舉獲得(針對 for-(in)) |
writeable | boolean | 表示是否可以修改屬性的值,爲false時,此屬性的值不能被修改 |
value | 根據具體值設定 | 屬性的數據值,寫入屬性的時候把新值保存在這個位置 |
(2)訪問器類型的特性(訪問器類型的屬性)
特性 | 數據類型 | 意義 |
configurable | boolean | 表示可否修改此屬性特性,爲false時,此屬性不能刪除(針對delete),且不能修改 |
enumerable | booelan | 表示此屬性是否能被枚舉,爲false時,不能被枚舉獲得(針對 for-(in)) |
get | function | 經過該函數返回該屬性的值 |
set | function | 修改該屬性的值,參數爲屬性的值. |
一點引伸(Value中其餘的特性):
<Key,Value>中Value是一個結構體,其保存的難道就只有上述列舉出的特性嗎?------固然不是
例如: 在描述數據類型的四個特性的value中,value也能夠表示一個對象,也能夠表示字符串,也能夠表示數字,那麼也就確定存在對value所表示類型的描述,只不過JS引擎是在後臺處理,咱們 看不到而已。
固然,在<Key,Vaule>的Value中還確定存在另一個特性,(base)-----base是一中引用類型的數據,指向擁有該屬性的對象。當value是函數類型的時候,該函數被調用時,用base來於初始化this指針,(固然,這些已超出咱們要討論的範圍)。