JavaScript系列-----對象基於哈希存儲(之Value篇) (3)

JavaScript系列-----Objectj基於哈希存儲<Key,Value>之Value


 

1.問題提出

JavaScript系列-----Object之基於Hash<Key,Value>存儲之Key篇 (1)中,咱們推理出:對象是以Hash結構存儲的,對象的屬性被表示爲多個<Key,Value>鍵值對。html

其中,Key的數據類型是字符串,可是,咱們並無說Value是以什麼數據結構存儲的,在本文中,咱們將繼續討論:Value的存儲類型-----博文的核心數據結構

既然在JavaScript中,對象的屬性是以鍵值對的形式存儲的,那麼咱們知道必須須要知道對象屬性的三種類型:dom

    1. 基本數據類型的屬性
    2. 引用數據類型的屬性
    3. 數據訪問器屬性

咱們用一個例子來分別說明這三種屬性類型:函數

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

 

2.<Key,Value>中Value的數據結構

在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結構存儲的。


 

3.Value中的各類特性值的含義

    (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指針,(固然,這些已超出咱們要討論的範圍)。

相關文章
相關標籤/搜索