词条信息

admin
admin
超级管理员
词条创建者 发短消息   

相关词条

热门词条

更多>>
什么是端口?到底是做什么的呢?
端口一般指两种,一种是硬件比如路由器或者交换机的插网线的端口,一种是软件的逻辑的概念,比如http的80端口!...
7种进阶方法让你快速测试端口连通性
Ping是Windows、Linux和Unix系统下的一个检查网络连通性的命令工具,对于大部分互联网用户来说很...
电脑开机,总需要按F1,是什么原因造成的?
一.主板掉电这个说法是行业内的叫法了,一般是主板的CMOS电池没电了导致的。也是最常见的一种提示你按F1的提示...
社保降费对个人有什么影响?
下调城镇职工基本养老保险单位缴费比例是政府给企业发的一个大红包,特别是对于企业来说是一个利好,但是对个人来说有...
车辆“出险”对下年保费的影响,到底有多大?
【出险对交强险的影响】【出险对商业险的影响】车辆“出险”对下年保费的影响,到底有多大?这里有必要先提下车险第三...

精选图集

更多>>
简易百科旧版 >>所属分类 >> 数据结构   

JavaScript常用数据结构

标签: JavaScrip 数据结构 js

顶[0] 发表评论(0) 编辑词条

常用数据结构:Array, Object


不常用数据结构:Set, WeakSet, Map, WeakMap


结构型数据:JSON


特殊结构:Function


常用数据结构


结构构造字面量说明


Arraynew Array()[a, b, c, d]有序排列数据


Objectnew Object(){key: value}对象,以键值对(key-value)的形式处理数据


日常使用强烈推荐使用字面量方式创建,以下能字面量就字面量说明,构造方法又是长篇大论,这里不做表述。


无论什么数据格式或结构,创建并赋值后,都会成为其对应的数据对象,获取其对象本身应具有的所有方法(或属性)


如:var a = 'aaa',此后的a便获取了字符串对象即String的所有方法(或属性),a.length就是3,等等。


Array


数组,列表。按照顺序排列数据,或者说内部数据是按照自然数顺序排列(0,1,2,3,4...n),如下:


// 字面量创建


var arr = [1, 2, 3, 4]


// 按照自然数索引获取,记住,是自然数,就是说从0开始索引,0为第一个,1为第二个……


arr[0] // 1


arr[1] // 2


arr[2] // 3


arr[3] // 4


下面简单介绍一些常用方法或属性:


方法(或属性)说明


length长度,属性


push尾部添加一个元素


pop删除尾部的元素


shift删除第一个元素


unshift添加元素到头部


splice替换数据(根据不同业务,可实现删除,插入以及替换功能)


slice截取数组


concat拼接数组


join数组转字符串


indexOf查找元素索引


实例如下,其中array = [3, 1, 2]每次使用都是这个值,不因为例子而更改


array.length3,获取数组的长度


array.push(4)array = [3, 1, 2, 4],自身添加到最后一个,返回长度


array.pop()array = [3, 1],自身删除最后一个,返回 pop


array.shift()array = [1, 2] ,删除数组第一个元素, 并返回该元素


array.unshift(4)array = [4, 3, 1, 2],添加若干到开头, 返回长度


arr = array.slice(0, 1)arr = [3], array 不变,从下标 0,到下标 1(下标可以是负数),返回新数组单不包含最后一个


arr = array.slice()arr = [3, 1, 2],深拷贝的一种方法


arr = array.concat(4, 5)arr = [3, 1, 2, 4, 5],连接若干数组或数组后添加值


arr = array.concat()arr = [3, 1, 2],深拷贝的另一种方法


arr = array.join('-')arr = 3-1-2,数组转字符串,不传参数默认使用逗号


arr = array.indexOf(1)arr = 1,获取1这个元素的索引位置,第二个,所以是1


所谓返回值是对方法(即函数)的一种特性表述,可以简单理解成,函数的功能是完成一件事情,返回值就是这件事情完成后的结果,比如有个函数(func1)的作用的生成100这个数(虽然毫无意义),那么就可以表述:var a = func1(),此时a就是100了。意义就是a接受了func1的返回值。


以下请自行查阅:


方法(或属性)说明


lastIndexOf反向查找元素索引


forEach遍历数组元素


map遍历数组元素


filter过滤数组


every检查数组是否全部符合某条件


some检查数组是否存在元素符合某条件


reduce迭代数组所有元素处理


reduceRight反向迭代数组所有元素处理


Object


我们常说的对象,字典,键值对。数据储存下来是没有前后顺序的,或许你会在相同的运行环境下,每次打印都是一样的顺序,但是事实上它就是无序的,切记。


创建与获取如下:


var obj = {


a: 1,


b: 2


}


obj.a // 1


obj[b] // 2


以上两种获取方式请注意,第一种是绝对常用模式,几乎没什么人会愿意多打[]的,但是[]的存在价值是有的,比如obj.x其中x如果是合法字符串还好,如果x是abc-xyz这种类型,则使用.就会非法,而此时使用obj['abc-xyz']即可,注意里面是字符串。


Object没有什么特殊的常用方法(或属性),因为你要什么,自己补充什么,如下:


var obj = {


num1: 1,


func1: function() {


return '我是函数'


},


}


obj.num1 // 1


obj.func1() // “我是函数”


看看下面这个,有没有什么感觉?


var array= {


length: 1,


indexOf: function(item) {


return 2


}


}


array.length // 1


array.indexOf('x') // 2


是不是很像数组的操作?


不要误解数组是上面这个对象啊,我只是想说,你要啥,自己补充啥,自己创建一个数组结构都可以。


对象的键值对里面的值,就是key-value的value也可以是Object,所以Object可以非常非常复杂(数组也是)。


数组与对象是可以互相套用的,虽然理论上可以无限套用下去,但请在实际使用中避免过多混合套用。


delete


一个比较重要的操作符,或者说是常用处理Object的一个方式:


delete obj.x删除对象obj的x键值对,返回值是个布尔值,说明有没有删除成功。


delete写法有两种,delete obj.x和delete(obj.x),这里要注意,形如delete或typeof这种,不是函数,他们是跟(++自增、--自减)一样的一元操作符,使用括号不是函数调用的意思。


严格来说delete可以操作所有引用,因此可以操作Object属性的引用。


delete示例:


var arr = [1, 2, 3]


var obj = {


a: 1,


b: 2


}


delete arr[1] // true


arr // [1, empty, 3],会删除索引为1元素的内容,但是不删除位置


delete obj.a // true


obj // {b: 2},a的键值对拿走了,干干净净


delete arr // true


arr // arr is not defined


delete obj


obj // obj is not defined


delete arr // true,此时的arr已经没有了,相当于delete个空,允许。


delete obj // 一样


由上方示例可以看出,delete在数组上使用时比较坑的,所以常见一点还是在Object上面使用。


别问{} + 1是多少,首先确实是当做0处理,但是实际中完全没有意义,因为数组里面假如是纯字符数组或纯数字数组,使用加减可以考虑省事,但是对象加减,当单纯是{}时候代表的不是Object,是代码块!当你使用new Object()填充数据时候,加减第一没有意义,第二任何情况结果都是(拿+1做示例)[object Object]1;{a: 1, b: 2} + 1是会报错,语法不正确。


不常用数据结构


简单介绍下Set,Map


Set


集合,你可以简单理解成键值对一样从而省略值得Object,也可以理解成被{}包裹的数组(不能重复,且无索引),常用来数组去重,代码看懂即可:


var arr = [1,2,3,4,4,2,1,5]


var set = new Set(arr)


set // {1, 2, 3, 4, 5}


方法(或属性)说明


size元素的个数,属性


add添加元素


delete删除元素


has检查是否有某个元素


keys所有元素


拿上面那个set做实例:


set.size // 5


set.add(6) // {1, 2, 3, 4, 5, 6}


set.delete(2) // {1, 3, 4, 5, 6}


set.has(2) // false


set.has(1) // true


set.keys() // {1, 3, 4, 5, 6}


Set可以通过for of遍历取值


Map


Map简单理解成是可以自定义键的Object,Object的键无法使用一些奇葩类型做键,比如对象,{{a: 1}: 1}这样报错,{'{a:1}' : 1}这样正确,因为键是字符串,但是Map就可以。


那么如果有这种特殊需求,就可以考虑使用Map了,我个人业务上从来没用到过,个人暂时不建议太多时间关注这块内容,故跳过。


WeakSet与WeakMap


这两个与Set和Map主要差异是,元素(或value)只能是引用类型,即数组,对象或函数类型,避免内存泄漏。


知道有这个东西就行,一样pass。


结构型数据


有很多种,比如表单,但是一定要尽量使用JSON,就是好用,谁用谁知道。谁让你不用JSON,你们确实需要好好谈谈了。


JSON


非常简单的理解方式,当做Object处理即可,数据结构与Object一模一样(转换时候Function值会丢失,下面会介绍如何处理),即key-value形式, 但是有个特殊,就是数组也当做合法的JSON结构。


// JSON


{


key1: value1,


key2: value2,


...


keyn: valuen


}


// 数组也行


[value1, value2, value3]


以上value当然可以是任何类型,除了Function,因为最终都是转成了String类型进行传输的。


那么如果你遇到了需要传输Function的业务,如下处理:


var json = {


a: 1,


b: function() {


return 'function'


}


}


// 会出现的问题


// JSON.stringify(json) // {a:1},函数那个丢失了,注意已经转成字符串了


// 处理方式


json.b += '' // 记得之前数据类型时候字符串加减法么,加空字符串相当于强制转为字符串


JSON.stringify(json) // {a:1,b:function() {\n return 'function'\n }},成功转换


JSON两个关键方法


方法说明


stringify对象(或数组)转字符串


parse字符串转对象(或数组)


JSON.stringify([1]) // [1]


JSON.parse([2]) // [2]


特殊结构


Function


严格来说,Function不是数据结构,但是它可以实现数据结构功能,或者存储数据。这里超纲,牵扯到了“类”,简单了解即可。


function MyObj() {


this.head = 'head'


this.foot = 'foot'


this.obj = {a: 1}


this.arr = [1,2]


this.func = function() {


return 'func'


}


}


var obj = new myObj()


obj.func += ''


obj // {head:head,foot:foot,obj:{a:1},arr:[1,2],func:function() {\n return 'func'\n }}


typeof obj // object

 

 

附件列表


按字母顺序浏览:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

→我们致力于为广大网民解决所遇到的各种电脑技术问题
 如果您认为本词条还有待完善,请 编辑词条

上一篇数据结构之图的关键路径
下一篇比特币“大崩盘”!

0
1. 本站部分内容来自互联网,如有任何版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
2. 本站内容仅供参考,如果您需要解决具体问题,建议您咨询相关领域专业人士。
3. 如果您没有找到需要的百科词条,您可以到百科问答提问或创建词条,等待高手解答。

关于本词条的提问

查看全部/我要提问>>