Javascript 数据结构

Javascript 数据结构

在本文章中

  1. 原始值
    1. 布尔值,null 和 undefined
    2. 数字
    3. 字符串
      1. Beware of "stringly-typing" your code!
  2. 对象
    1. "Normal" objects, and functions
    2. Arrays
    3. Dates
    4. WeakMaps, Maps, Sets
    5. TypedArrays
  3. See also

编程语言都具有内建的数据结构,但各种编程语言的数据结构常有不同之处。 本文尝试展现 JavaScript 语言中内建的数据结构及其属性,它们可以用来构建其他的数据结构, 同时尽可能的描述 JavaScript 数据结构与其他语言的不同之处。

ECMAScript 标准定义了 6 种数据类型:

  • Number
  • String
  • Boolean
  • Null
  • Undefined
  • Object

在下面的章节, 我们将看到这些数据类型如何被用于表现数据以及组合实现更复杂的数据结构。

原始值

对象以外的所有类型都定义不变的值。 特别是字符串是不可变的(与 C 语言不同)。 我们称这些类型的值为“原始值”。 在下面的 Strings(字符串)章节会更详细的解释。

布尔值,null 和 undefined

在这些类型里面,只有4种类型被定义成常量:true,falsenull,和undefined。 因为它们是常量,所以不能使用它们来呈现丰富的数据(或数据结构)。

数字

依据 ECMAScript 标准,只有一种数字类型:它是一个基于IEEE 754标准的双精度64位二进制格式的值。所以它并没有为整数给出一种特定的类型。 除了能够表示浮点型的数值之外,还有一些带符号的值:+Infinity,-Infinity,和 NaN (非数值)。

尽管一个数字常常仅代表它本身的值,但JavaScript提供了一些位操作符。 这些位操作符和一个单一数字通过位操作可以用来表现一些布尔值。但这通常被认为是一个不好的做法,因为 JavaScript 提供了其他的手段来表示一组布尔值(如一个布尔值数组或一个布尔值分配给命名属性的对象)。 在一些非常受限的情况下,可能需要用到这些技术,比如试图应付本地存储的存储限制orin extreme cases when each bit over the network counts. This technique should only be considered when it is the last thing that can be done to optimize size.

字符串

不像 C 语言, JavaScript 字符串是不可更改的。这意味着字符串一旦被创建,就不能被修改。无论如何,它仍然可以通过新创建一个基于操作原字符串的新字符串(这么绕口),例如:通过String.substring, String.substr, String.slice, String.concat 等操作来修改原字符串时。

Beware of "stringly-typing" your code!

It can be tempting to use strings to represent complex data. They have a couple of nice properties:

  • It's easy to build complex strings with concatenation.
  • Strings are easy to debug (what you see printed is always what is in the string).
  • Strings are the common denominator of a lot of APIs (input fieldslocal storage values, XMLHttpRequest responses when usingresponseText, etc.) and it can be tempting to only work with strings.

With conventions, it is possible to represent any data structure in a string. This does not make it a good idea. For instance, with a separator, one could emulate a list (while a JavaScript array would be more suitable). Unfortunately, when the separator is used in one of the "list" elements, then, the list is broken. An escape character can be chosen, etc. All of this requires conventions and becomes a maintenance burden which does not exist when the right tool for the right job is used.

It is recommended to use strings for textual data and symbolic data, but to parse strings and use the right abstraction for what it is supposed to represent otherwise.

对象

在Javascript里,对象可以被看作是一个特性包。用对象字面量语法来定义一个变量或者对象,会自动初始化部分属性(也就是说,你定义一个var a = "Hello",那么a本身就会有a.substring这个方法,以及a.length这个属性,以及其它;如果你定义了一个对象,var a = {},那么a就会自动有a.hasOwnProperty及a.constructor等属性和方法。)这些属性和方法都可以被更改,包括其它复杂对象。

 

"Normal" objects, and functions

A JavaScript object is a mapping between keys and values. Keys are strings and values can be anything. This makes objects a natural fit for hashmaps. However, one has to be careful about the non-standard __proto__ pseudo property. In environment that supports it, '__proto__'does not allow to manipulate one property with such a name, but the object prototype. In context where it is not necessarily known where the string comes from (like an input field), caution is required: other have been burned by this. In that case, an alternative is to use a proper StringMap abstraction.

Functions are regular objects with the additional capability of being callable.

Arrays

Arrays are regular objects for which there is a particular relationship between integer-key-ed properties and the 'length' property. Additionally, arrays inherit from Array.prototype which provides to them a handful of convenient methods to manipulate arrays like indexOf (searching a value in the array) or push (adding an element to the array), etc. This makes arrays a perfect candidate to represent lists or sets.

Dates

When considering representing dates, the best choice is certainly to use the built-in Date utility

WeakMaps, Maps, Sets

Non-standard. Likely to be standardized as part of ECMAScript 6.

These data structures take object references as keys. A Set represents a set of objects, while WeakMaps and Maps associates a value to an object. The difference between Maps and WeakMaps is that in the former, object keys can be enumerated over. This allows garbage collection optimizations in the latter case.

One could implement Maps and Sets in pure ECMAScript 5. However, since objects cannot be compared (in the sense of "less than" for instance), look-up performance would necessarily be linear. Native implementations of them (including WeakMaps) can have look-up performance that is approximately logarithmic to constant time.

Usually, to bind data to a DOM node, one could set properties directly on the object or use data-* attributes. This has the downside that the data is available to any script running in the same context. Maps and WeakMaps make easy to privately bind data to an object.

TypedArrays

Non-standard. Likely to be standardized as part of ECMAScript 6.

See also

文档标签和贡献者

对本页有贡献的人: polucy_WhiteCuspElvis_7keechiteoli

最后编辑者: teoli, May 6, 2014 12:59:34 AM

时间: 2024-10-23 21:08:49

Javascript 数据结构的相关文章

Javascript数据结构与算法之列表详解

 这篇文章主要介绍了Javascript数据结构与算法之列表详解,本文讲解了列表的抽象数据类型定义.如何实现列表类等内容,需要的朋友可以参考下     前言:在日常生活中,人们经常要使用列表,比如我们有时候要去购物时,为了购物时东西要买全,我们可以在去之前,列下要买的东西,这就要用的列表了,或者我们小时候上学那段时间,每次考完试后,学校都会列出这次考试成绩前十名的同学的排名及成绩单,等等这些都是列表的列子.我们计算机内也在使用列表,那么列表适合使用在什么地方呢?不适合使用在什么地方呢? 适合使用

JavaScript数据结构与算法之栈详解

 这篇文章主要介绍了JavaScript数据结构与算法之栈详解,本文讲解了对栈的操作.对栈的实现实例等内容,需要的朋友可以参考下     在上一篇博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈.栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样操作很快,而且容易实现. 一:对栈的操作. 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端陈为栈顶.比如餐馆里面洗盘子,只能先洗

JavaScript数据结构和算法之图和图算法

 这篇文章主要介绍了JavaScript数据结构和算法之图和图算法,本文讲解了有向图.无序图.简单图.图的遍历等内容,需要的朋友可以参考下     图的定义 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 有向图 有向边:若从顶点Vi到Vj的边有方向,则称这条边为有向边,也成为弧(Arc),用有序偶<Vi,Vj>来表示,Vi称为弧尾,Vj称为弧头. 无序图 无向边:若顶点Vi到Vj之间的边没

JavaScript数据结构和算法之二叉树详解

 这篇文章主要介绍了JavaScript数据结构和算法之二叉树详解,本文讲解了二叉树的概念.二叉树的特点.二叉树节点的定义.查找最大和最小值等内容,需要的朋友可以参考下     二叉树的概念 二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两棵互不相交的.分别称为根结点的左子树和右子树的二叉树组成. 二叉树的特点 每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点.二叉树中每一个节点都是一个对象,每一个数据节点都有三个指针,

JavaScript数据结构与算法之栈与队列_基础知识

学习起因 曾经有一次在逛V2EX时,碰到这么一个帖子. 数学完全还给老师了,想学回一些基础数学,大概是高中程度的,有什么书籍推荐? 发帖的楼主大学没有高数课程,出去工作时一直在从事前端的工作.感觉到数学知识的匮乏,所以想补一补数学. 看了看帖子,感觉和我很像,因为我的专业是不开高数的,我学的也是前端.也同样感觉到了数学知识匮乏所带来的困顿.同时因为自己的数学思维实在是不怎么好,所以决定努力补习数学与计算机基础知识. 当时也有人说:"前端需要什么数据结构与算法",但是对于这个事情我有自己

JavaScript数据结构链表知识详解_javascript技巧

最近在看<javascript数据结构和算法>这本书,补一下数据结构和算法部分的知识,觉得自己这块是短板. 链表:存储有序的元素集合,但不同于数组,链表中的元素在内存中不是连续放置的.每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 好处:可以添加或移除任意项,它会按需扩容,且不需要移动其他元素. 与数组的区别:     数组:可以直接访问任何位置的任何元素:     链表:想要访问链表中的一个元素,需要从起点(表头)开始迭代列表直到找到所需的元素. 做点小笔

Javascript数据结构与算法之列表详解_javascript技巧

前言:在日常生活中,人们经常要使用列表,比如我们有时候要去购物时,为了购物时东西要买全,我们可以在去之前,列下要买的东西,这就要用的列表了,或者我们小时候上学那段时间,每次考完试后,学校都会列出这次考试成绩前十名的同学的排名及成绩单,等等这些都是列表的列子.我们计算机内也在使用列表,那么列表适合使用在什么地方呢?不适合使用在什么地方呢? 适合使用在:当列表的元素不是很多的情况下,可以使用列表,因为对列表中的元素查找或者排序时,效率还算非常高,反之:如果列表元素非常多的情况下,就不适合使用列表了.

javascript数据结构之双链表插入排序实例详解_javascript技巧

本文实例讲述了javascript数据结构之双链表插入排序实现方法.分享给大家供大家参考,具体如下: 数组存储前提下,插入排序算法,在最坏情况下,前面的元素需要不断向后移,以便在插入点留出空位,让目标元素插入. 换成链表时,显然无需做这种大量移动,根据每个节点的前驱节点"指针",向前找到插入点后,直接把目标值从原链表上摘下,然后在插入点把链表断成二截,然后跟目标点重新接起来即可. <!doctype html> <html> <head> <t

JavaScript数据结构与算法之集合(Set)_基础知识

集合(Set) 说起集合,就想起刚进高中时,数学第一课讲的就是集合.因此在学习集合这种数据结构时,倍感亲切. 集合的基本性质有一条: 集合中元素是不重复的.因为这种性质,所以我们选用了对象来作为集合的容器,而非数组. 虽然数组也能做到所有不重复,但终究过于繁琐,不如集合. 集合的操作 集合的基本操作有交集.并集.差集等.这儿我们介绍JavaScipt集合中交集.并集.差集的实现. JavaScipt中集合的实现 首先,创建一个构造函数. /** * 集合的构造函数 */ function Set