JavaScript系列-----Objectj基于哈希存储<Key,Value>之Value


1.问题提出

JavaScript系列-----Object之基于Hash<Key,Value>存储之Key篇 (1)中,我们推理出:对象是以Hash结构存储的,对象的属性被表示为多个<Key,Value>键值对。

其中,Key的数据类型是字符串,但是,我们并没有说Value是以什么数据结构存储的,在本文中,我们将继续讨论:Value的存储类型-----博文的核心

既然在JavaScript中,对象的属性是以键值对的形式存储的,那么我们知道必须需要知道对象属性的三种类型:

    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是怎么表示这三种属性的!

2.<Key,Value>中Value的数据结构

在JavaScript高级程序设计(第三版)中,是这么描素属性的:属性在创建时都带有一些特征值,JavaScript引擎通过这些特征值来定义他们的行为。

下面,分别讨论这三种属性分别用哪些特征值来描述:

(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).访问器类型的属性

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指针,(当然,这些已超出我们要讨论的范围)。

JavaScript系列-----对象基于哈希存储(<Key,Value>之Value篇) (3)的更多相关文章

  1. JavaScript系列-----对象基于哈希存储(<Key,Value>之Key篇) (1)

    1.Hash表的结构 首先,允许我们花一点时间来简单介绍hash表. 1.什么是hash表 hash表是一种二维结构,管理着一对对<Key,Value>这样的键值对,Hash表的结构如下图 ...

  2. 深入理解JavaScript系列(46):代码复用模式(推荐篇)

    介绍 本文介绍的四种代码复用模式都是最佳实践,推荐大家在编程的过程中使用. 模式1:原型继承 原型继承是让父对象作为子对象的原型,从而达到继承的目的: function object(o) { fun ...

  3. 深入理解JavaScript系列(45):代码复用模式(避免篇)

    介绍 任何编程都提出代码复用,否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量 ...

  4. Javascript系列——对象元素的数组去重实现

    概要 这是一篇记录文,记录数组操作对象去重的实现. 需求 有这样一个数组 [{ _id: 123, name: '张三' },{ _id: 124, name: '李四' },{ _id: 123, ...

  5. JavaScript系列----数据类型以及传值和传引用

    1.简单数据类型 在JavaScript中简单数据类型分为5种.分别为 Undefined, Null,Boolean,Number,String. Undefined类型Undefined类型只有一 ...

  6. 深入理解JavaScript系列

    转自http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 深入理解JavaScript系列(1):编写高质量JavaScript代码 ...

  7. 深入理解JavaScript系列(转自汤姆大叔)

    深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript ...

  8. [转]深入理解JavaScript系列

    文章转自:汤姆大叔-深入理解JavaScript系列文章 深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解Ja ...

  9. [转载]深入理解JavaScript系列 --汤姆大叔

    深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript ...

随机推荐

  1. 【笔记】php常用函数

    phpusleep() 函数延迟代码执行若干微秒.unpack() 函数从二进制字符串对数据进行解包.uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.time_sleep_unti ...

  2. html表格宽度设置失效

    问题描述: 我在写一个网页table时,table宽度超过了我预想的宽度,我想把它设置小一点,但总是没效果.改到怀疑人生!代码如下: 经过多次调试后发现一个问题,table可以改变大小,但是会有一个最 ...

  3. Apache shiro的简单介绍与使用(与spring整合使用)

    apache shiro框架简介 Apache Shiro是一个强大而灵活的开源安全框架,它能够干净利落地处理身份认证,授权,企业会话管理和加密.现在,使用Apache Shiro的人越来越多,因为它 ...

  4. C-多个行内块布局

    1 消除间隔

  5. Linux文件类型介绍

    文件类型介绍: Linux系统不同于Windows系统,两者文件类型和文件扩展名也有很大的差异.Linux中的文件类型和Linux文件的文件扩展名所代表的意义和Windows系统完全不同.用户一般通过 ...

  6. git的使用(入门篇)

    1.Git 的安装 Window 下的安装 从 http://git-scm.com/download 上下载window版的客户端,然后一直下一步下一步安装git即可,请注意,如果你不熟悉每个选项的 ...

  7. 记录一个Unity播放器插件的开发

    背景 公司最近在做VR直播平台,VR开发我们用到了Unity,而在Unity中播放视频就需要一款视频插件,我们调研了几个视频插件,记录两个,如下: Unity视频插件调研 网上搜了搜,最流行的有以下两 ...

  8. sap表维护工具来维护自定义表&视图簇的使用

    一.通过表维护工具维护自定义表 1.SE11创建表 2.se11界面的菜单:实用程序->Table Maintenance Generator其实这里就是调用SE54 3.sm30 调用维护好的 ...

  9. Android SDK国内更新

    恩,废话就不多说了,俩网址,mirrors.neusoft.edu.cn和ubuntu.buct.edu.cn,在这里感谢wecloud和北京化工大学,十分感谢提供方便之门

  10. 兼容性问题--HTML+CSS

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #a5b2b9 } span.Apple-tab-span ...