JavaScript数组
栏目: JavaScript · 发布时间: 5年前
内容简介:在使用构造函数创建数组时如果传入一个数字参数,则会创建一个长度为参数的数组,如果传入多个,则创建一个数组,参数作为初始化数据加到数组中数组(JS理解:数据就是原型链中有
在使用构造函数创建数组时如果传入一个数字参数,则会创建一个长度为参数的数组,如果传入多个,则创建一个数组,参数作为初始化数据加到数组中
var a1 = new Array(5); console.log(a1.length);//5 console.log(a1); //会生成一个length为5,每一个都是undefined的数组 var a2 = new Array(5,6); console.log(a2.length);//2 console.log(a2); //[5,6] 复制代码
数组的定义
数组( array
)是按次序排列的一组值。每个值的位置都有编号(从0开始),整个数组用方括号表示。
JS理解:数据就是原型链中有 Array.prototype
的对象
当我们声明一个 var a1 = [1, 2, 3];
的时候,会生成一个有四个 key
数组对象。为什么 a1
它有 push
函数呢 因为我们连接到了一个公用对象,可以在公用对象中找到,它的 __proto__
指向 Array.prototype
var a = [1, 2, 3] var obj = { 0: 1, 1: 2, 2: 3, length: 3 } 复制代码
这两个声明其实不是同一个对象,为什么呢?
因为它们的公用属性是不一样的。 a.__proto__
指向的是数组的公用属性 Array.prototype
,这个公用属性有 push
、 pop
等函数, Array.__proto__
指向的是 Object.prototype
。而 obj.__proto__
并没有指向 Array.prototype
,它是 Object
构造出来的,直接指向 Object.prototype
。也就是说这两个对象本身的内存是没有区别的,它的区别在于原型是不一样的。数组之所以为数组,是因为它拥有数组的特点,对象之所以为对象,是因为它没有数组的特点。所以数组和对象本质的区别就是它们的 __proto__
有没有指向 Array.prototype
。
数组的索引与长度
数组的值可以通过自然数索引访问进行读写操作,下标也可以是一个得出非负整数的变量或表达式
var a1 = [1,2,3,4]; console.log(a1[0]); //1 var i=1; console.log(a1[i]); //2 console.log(a1[++i]); //3 复制代码
数组也是对象,我们可以使用索引的奥秘在于,数组会把索引值转换为对应字符串 (1 => '1')
作为对象属性名
console.log(1 in a1);//true,确实是一个属性 复制代码
这样我们可以看出所有的索引都是属性名,但只有自然数(有最大值)才是索引。数组的索引可以不是连续的,访问 index
不存在的元素的时候返回 undefined
var a = new Array(1,2,3); a[100] = 100; console.log(a.length); //101 console.log(a[3]); //undefined console.log(a[100]); 100 复制代码
上面的例子中,虽然直接对 a[100]
赋值不会影响 a[4]
或 a[99]
,但数组的长度却受到影响,数组 length
属性等于数组中最大的 index+1
,我们知道数组的 length
属性同样是个可写的属性,当强制把数组的 length
属性值设置为小于等于最大 index
值时,数组会自动删除 indexd
大于等于 length
的数据,在刚才代码中追加几句
a.length = 2 console.log(a);//[1,2] 复制代码
这时候会发现 a[2]
和 a[100]
被自动删除了,同理,如果把 length
设置为大于最大 index+1
的值的时候,数组也会自动扩张,但是不会为数组添加新元素,只是在尾部追加空空间
a.length=5; console.log(a); //[1,2] //后面没有3个undefined 复制代码
数组的 API
-
splice()
splice
方法用于删除原数组的一部分成员,并可以在删除的位置添加新的数组成员,返回值是被删除的元素。注意,该方法会改变原数组。方法有三个参数,开始索引,删除元素的位移和插入的新元素,当然也可以写多个。
- 删除
splice
的第一个参数是删除的起始位置(从 0 开始),第二个参数是被删除的元素个数。如果后面还有更多的参数,则表示这些就是要被插入数组的新元素
var a = ['a', 'b', 'c', 'd', 'e', 'f']; a.splice(4, 2) // ["e", "f"] a // ["a", "b", "c", "d"] a.splice(4, 2, 1, 2) // ["e", "f"] a // ["a", "b", "c", "d", 1, 2] 复制代码
- 添加 如果只是单纯地插入元素,
splice
方法的第二个参数可以设为 0
var a = [1, 1, 1]; a.splice(1, 0, 2) // [] a // [1, 2, 1, 1] 复制代码
-
slice()
slice
方法用于提取目标数组的一部分,返回一个新数组,原数组不变。
var a = [1,2,3,4,5]; a.slice(1,2);//2 从 a 下标为1开始,到下标为2结束(不包括2),做为新数组,原数组不变 复制代码
-
reverse()
reverse
方法用于将数组逆序,与之前不同的是它会修改原数组
var a = [1,2,3,4,5]; a.reverse(); console.log(a); //[5, 4, 3, 2, 1] 复制代码
-
join()
join
方法是把数组元素(对象调用其 toString()
方法)使用参数作为连接符连接成一字符串,不会修改原数组内容。如果不提供参数,默认用逗号分隔。
var a = [1, 2, 3]; a.join(' ') // '1 2 3' a.join(' . ') // "1 . 2 . 3" a.join() // "1,2,3" 复制代码
-
concat()
看起来像是剪切,但这个真不是形声字, concat
方法用于拼接数组, a.concat(b)
返回一个 a 和 b 共同组成的新数组,同样不会修改任何一个原始数组,也不会递归连接数组内部数组。
var a = [1,2,3,4,5]; var b = [6,7,8,9]; console.log(a.concat(b)); //[1, 2, 3, 4, 5, 6, 7, 8, 9] console.log(a); //[1, 2, 3, 4, 5] console.log(b); //[6, 7, 8, 9] 复制代码
-
forEach()
forEach
方法对数组的所有成员依次执行参数函数,该函数接受三个参数: value
、 key
、整个数组。
var a = ['a', 'b', 'c']; a.forEach(function(q, w, e){ console.log(q, w, e) }) // a 0 (3) ["a", "b", "c"] // b 1 (3) ["a", "b", "c"] // c 2 (3) ["a", "b", "c"] 复制代码
-
sort()
sort
方法对数组成员进行排序,默认是按照转换为的字符串的诸个字符的 Unicode 位点进行排序。排序后,原数组将被改变。
[4, 3, 2, 1].sort() // [1, 2, 3, 4] 复制代码
如果想让sort方法按照自定义方式排序,可以传入一个函数作为参数。
var items = [ { name: 'Edward', value: 37}, { name: 'Sharpe', value: 24}, { name: 'And', value: 45 } ]; items.sort(function (a, b) { return (a.value - b.value) }); // {name: "Sharpe", value: 24} // {name: "Edward", value: 37} // {name: "And", value: 45} 复制代码
sort
的参数函数本身接受两个参数,表示进行比较的两个数组成员。如果该函数的返回值大于 0,表示第一个成员排在第二个成员后面;其他情况下,都是第一个元素排在第二个元素前面。
-
map()
map
方法对数组中每一元素进行处理,函数返回值组成一个新数组返回,新数组索引结构和原数组一致,原数组保持不变。
var arr = [1, 2, 3, 4, 5, 6] arr.map(function(val){ return val*val // [1, 4, 9, 16, 25, 36] 复制代码
-
filter()
filter
方法用于过滤数组成员,接受一个函数,所有数组成员依次执行该函数,返回结果为 true
的成员组成一个新数组返回。
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9] arr.filter(function (val) { return (val > 5); }) // [6, 7, 8, 9] 复制代码
-
reduce()
reduce
方法依次处理数组的每个成员,两元素(或参数)执行操作,数组元素返回组合成一个值,遍历数组,继续和数组中 其他元素组合,最终得出结果。
var arr = [1, 2, 3, 4, 5] arr.reduce(function (a, b) { console.log(a, b); return a + b; }) // 15 复制代码
-
map
可以用reduce
表示
var a = [1, 2, 3] a.reduce(function(arr, n){ arr.push(n * 2) return arr }, []) // [2, 4, 6] 复制代码
-
filter
可以用reduce
表示
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] a.reduce(function(arr, n){ if(n % 2 === 0){ arr.push(n) } return arr }, []) // [2, 4, 6, 8, 10] 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- C语言指针数组和数组指针
- 数组 – 如何在Swift中将数组拆分成两半?
- 菜鸡的算法修炼:数组(旋转数组的最小数字)
- 交换数组元素,使得数组的和的差最小
- JS数组专题1️⃣ ➖ 数组扁平化
- 算法-计算小数组在大数组中的索引
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深度探索C++对象模型
斯坦利•B.李普曼 (Stanley B. Lippman) / 侯捷 / 电子工业出版社 / 2012-1 / 69.00元
作者Lippman参与设计了全世界第一套C++编译程序cfront,这本书就是一位伟大的C++编译程序设计者向你阐述他如何处理各种explicit(明确出现于C++程序代码中)和implicit(隐藏于程序代码背后)的C++语意。 本书专注于C++面向对象程序设计的底层机制,包括结构式语意、临时性对象的生成、封装、继承,以及虚拟——虚拟函数和虚拟继承。这本书让你知道:一旦你能够了解底层实现模......一起来看看 《深度探索C++对象模型》 这本书的介绍吧!