JavaScript数据类型与数据结构

编程语言都具备内建的数据结构,但各类编程语言的数据结构常有不一样之处。本文试图列出 JavaScript 语言中内建的数据结构及其属性,它们能够用来构建其余的数据结构;同时尽量的描述与其余语言的不一样之处。编程


动态类型

JavaScript 是一种弱类型或者说动态语言。这意味着你不用提早声明变量的类型,在程序运行过程当中,类型会被自动肯定。这也意味着你可使用同一个变量保存不一样类型的数据:数组

var foo = 42;    // foo is a Number now
foo = "bar"; // foo is a String now
foo = true;  // foo is a Boolean now

注:TypeScript编译语言针对此问题作了改进;数据结构


数据类型

最新的 ECMAScript 标准定义了 7 种数据类型:编程语言

  • 6 种原始类型:函数

    • Boolean
    • Null
    • Undefined
    • Number
    • String
    • Symbol (ECMAScript 6 新定义)
  • 和 Object

原始值(primitive values)

除 Object 之外的全部类型都是不可变的(值自己没法被改变)。例如,与 C 语言不一样JavaScript中字符串是不可变的(译注:如,JavaScript中对字符串的操做必定返回了一个新字符串,原始字符串并无被改变)。 咱们称这些类型的值为“原始值”

布尔类型(boolean)工具

布尔表示一个逻辑实体,能够有两个值:true 和 false。spa

Null类型prototype

Null 类型只有一个值: null。值 null 特指对象的值未设置。值 null 是一个字面量,它不像undefined 是全局对象的一个属性。null 是表示缺乏的标识,指示变量未指向任何对象。把 null 做为还没有建立的对象,也许更好理解。在 APIs 中,null 常在返回类型是对象,但没关联值的地方使用。3d

Undefined类型调试

一个没有被赋值的变量会有个默认值 undefined,undefined是全局对象的一个属性。也就是说,它是全局做用域的一个变量。

数字类型

根据 ECMAScript 标准,JavaScript 中只有一种数字类型:基于 IEEE 754 标准的双精度 64 位二进制格式的值(-(263 -1) 到 263 -1)。它并无为整数给出一种特定的类型。除了可以表示浮点数外,还有一些带符号的值:+Infinity,-Infinity 和 NaN (非数值,Not-a-Number)。

字符串类型

JavaScript的字符串类型用于表示文本数据。它是一组16位的无符号整数值的“元素”。在字符串中的每一个元素占据了字符串的位置。第一个元素的索引为0,下一个是索引1,依此类推。字符串的长度是它的元素的数量。

JavaScript 字符串是不可更改的。这意味着字符串一旦被建立,就不能被修改。可是,能够基于对原始字符串的操做来建立新的字符串。例如:

获取一个字符串的子串可经过选择个别字母或者使用 String.substr().
两个字符串的链接使用链接操做符 (+) 或者 String.concat().

可使用字符串来表达复杂的数据。如下是一些很好的性质:

  • 容易链接构造复杂的字串符
  • 字符串容易被调试(你看到的每每在字符串里)
  • 字符串一般是许多APIs的常见标准 (input fields, local storage values, XMLHttpRequest当使用responseText等的时候回应) 并且他只能与字符串一同使用。

按照惯例, 字符串通常能够用来表达任何数据结构。这不是一个好主意。例如,使用一个分隔符,一个能够模仿一个列表(一个JavaScript的数组可能更适合一些) 。不幸的是,当一个分隔符在用于列表中的元素时,打乱了这个列表。 一个转义字符等。全部这些惯例都变成了一个不存在的维护负担而没有正确的工具使用。

表达文本数据和符号数据时候推荐使用字符串。当表达复杂的数据时,使用字符串解析和适当的缩写。

符号类型

符号(Symbols)是ECMAScript 第6版新定义的。符号类型是惟一的而且是不可修改的, 而且也能够用来做为Object的key的值(以下). 在某些语言当中也有相似的原子类型(Atoms). 你也能够认为为它们是C里面的枚举类型.

Symbol()函数会返回symbol类型的值,该类型具备静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的symbol注册,且相似于内建对象类,但做为构造函数来讲它并不完整,由于它不支持语法:"new Symbol()"。每一个从Symbol()返回的symbol值都是惟一的。

const symbol1 = Symbol();
const symbol2 = Symbol(42);
const symbol3 = Symbol('foo');

console.log(typeof symbol1);
// expected output: "symbol"

console.log(symbol3.toString());
// expected output: "Symbol(foo)"

console.log(Symbol('foo') === Symbol('foo'));
// expected output: false

对象

在计算机科学中, 对象是指内存中的能够被 标识符引用的一块区域.

属性

在 Javascript 里,对象能够被看做是一组属性的集合。用对象字面量语法来定义一个对象时,会自动初始化一组属性。(也就是说,你定义一个var a = "Hello",那么a自己就会有a.substring这个方法,以及a.length这个属性,以及其它;若是你定义了一个对象,var a = {},那么a就会自动有a.hasOwnProperty及a.constructor等属性和方法。)然后,这些属性还能够被增减属性的值能够是任意类型,包括具备复杂数据结构的对象。属性使用键来标识,它的键值能够是一个字符串或者符号值(Symbol)。

ECMAScript定义的对象中有两种属性:数据属性和访问器属性。

  • 数据属性

    数据属性是键值对,而且每一个数据属性拥有下列特性:

    图片描述

  • 访问性属性
    访问器属性有一个或两个访问器函数 (get 和 set) 来存取数值,而且有如下特性:

    图片描述

"标准的" 对象, 和函数节
一个 Javascript 对象就是键和值之间的映射。键是一个字符串(或者 Symbol) ,值能够是任意类型的值。 这使得对象很是符合哈希表。

函数是一个附带可被调用功能的常规对象。

日期
当你想要显示日期时,毋庸置疑,使用内建的 Date 对象。

有序集: 数组和类型数组

数组是一种使用整数做为键(integer-key-ed)属性和长度(length)属性之间关联的常规对象。此外,数组对象还继承了 Array.prototype 的一些操做数组的便捷方法。例如, indexOf (搜索数组中的一个值) or push (向数组中添加一个元素),等等。 这使得数组是表示列表或集合的最优选择。

类型数组(Typed Arrays)是ECMAScript Edition 6中新定义的 JavaScript 内建对象,提供了一个基本的二进制数据缓冲区的类数组视图。

相关文章
相关标签/搜索