吃透Javascript数组操作的正确姿势—再读《Js高程》
Javascript中关于数组对象的操作方法比较多也比较杂,正好再次捡起《Javascript高级程序设计》来读,把它们一一总结梳理了一下:
方法类别 |
方法名称 |
方法描述 |
参数 |
返回值 |
备注 |
转换方法 |
toString() |
把数组转换为字符串,并返回结果。 |
无 |
以逗号分隔的字符串 |
调用每一项的toString()方法 |
valueOf() |
返回数组对象的原始值。 |
无 |
原数组 |
||
toLocaleString() |
把数组转换为字符串,并返回结果。 |
无 |
以逗号分隔的字符串 |
调用每一项的toLocaleString()方法 |
|
join() |
用指定的分隔符把数组的所有元素放入一个字符串。 |
无参数或者一个参数 |
以指定分隔符分隔的字符串 |
不传参数时,以逗号分隔 |
|
栈和队列方法 |
push() |
向数组的末尾添加一个或更多元素 |
任意数量参数 |
返回新的长度 |
原数组被修改了,长度也变了 |
pop() |
删除数组的最后一个元素并。 |
无参数 |
返回删除的元素 |
原数组被修改了,长度也变了 |
|
shift() |
删除数组的第一个元素并返回删除的元素。 |
无参数 |
返回删除的元素 |
原数组被修改了,长度也变了 |
|
unshift() |
向数组的开头添加一个或更多元素。 |
任意数量参数 |
返回新的长度。 |
原数组被修改了,长度也变了 |
|
重排序方法 |
reverse() |
反转数组的元素顺序。 |
无参数 |
反转后的数组 |
原数组被修改后返回(再次访问数组变量是反转之后的值) |
sort() |
对数组的元素进行排序。 |
无参数或者一个比较函数做参数 |
排序后的数组 |
默认是按升序排列,可通过比较函数做参数决定排序规则。同样原数组被修改后返回 |
|
操作方法 |
concat() |
连接两个或更多的数组,并返回结果 |
任意数量参数,如果参数是数组,会拆分数组的每一项添加到结果数组数组 |
返回连接后的新数组 |
concat()方法不会修改原数组,而是先创建当前数组的副本,在副本上进行连接,而原数组在操作前后并不会发生变化 |
slice() |
选取数组的的一部分,并返回一个新数组。 |
零到两个参数 |
返回新创建的数组 |
slice()方法不会修改原数组,而是基于原数组中的项创建新数组返回 |
|
splice() |
实现数组项的删除、插入、替换 |
零到三个参数 |
包含从原数组中删除项的数组 |
原数组会按照相应操作改变,如果没有删除任何项,则返回一个空数组 |
|
位置方法 |
indexOf() |
搜索数组中的元素,并返回它所在的索引位置 |
要查找的项和可选的查找起点位置索引 |
查找项在数组中的索引位置,没找到就返回-1 |
在查找过程中比较参数与数组中的项时,使用全等操作符(===) |
lastIndexOf() |
返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。 |
查找项在数组中的索引位置,没找到就返回-1 |
在查找过程中比较参数与数组中的项时,使用全等操作符(===) |
||
迭代方法 |
every() |
检测数值元素的每个元素是否都符合条件 |
给定一个判定函数 |
如果该函数对每一项都返回 true,则返回 true。 |
做为参数的判定函数、过滤函数或处理函数会接收三个参数:数组项的值、该项在数组中的索引位置、数组对象本身 |
|
some() |
检测数组元素中是否有元素符合指定条件。 |
如果该函数对任一项返回 true,则返回 true。 |
||
|
filter() |
检测数值元素,并返回符合条件所有元素的数组。 |
给定一个过滤函数 |
返回该函数会返回 true 的项组成的数组 |
|
|
forEach() |
对数组中的每一项运行给定函数 |
给定一个处理函数 |
无返回值 |
|
|
map() |
通过指定函数处理数组的每个元素,并返回处理后的数组。 |
返回每次函数调用的结果组成的数组 |
||
归并方法 |
reduce() |
这两个方法都会迭代数组的所有项,然后构建一个最终返回的值。 |
这两个方法都接收两个参数:一个在每一项上调用的函数和(可选的)作为归并基础的初始值。 |
归并后的值 |
给 reduce() 和 reduceRight() 的函数接收 4 个参数:前一个值、当前值、项的索引和数组对象。这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第一个参数是数组的第一项,第二个参数就是数组的第二项。 |
|
reduceRight() |
Note:
No1.如果数组的某一项是null或者是undefined,那么该值在join(),toLocaleString(),toString()方法返回的结果中以空字符串表示。
var values=[1,null,3,4];
console.log(values.join()); //1,,3,4
var values=[1,undefined,3,4];
console.log(values.valueOf()); //[ 1, undefined, 3, 4 ]
var values=[1,2,3,4];
values.push(5,[6,7]);
values.unshift(-2,[0,-1])
console.log(values);//[ -2, [ 0, -1 ], 1, 2, 3, 4, 5, [ 6, 7 ] ]
No3.sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串。
var values=[5,10,3,4];
values.sort();
console.log(values);//[ 10, 3, 4, 5 ]
function compare(value1,value2) {
return value1-value2;
}
var values=[5,10,3,4];
values.sort(compare);
console.log(values);//[ 3, 4, 5, 10 ]
var colors = ["red", "green", "blue"];
var colors2 = colors.concat("yellow", ["black", "brown"]);
console.log(colors); //[ 'red', 'green', 'blue' ]
console.log(colors2); //[ 'red', 'green', 'blue', 'yellow', 'black', 'brown' ]
No5.slice()方法的分割区间为左闭右开区间,即[起点索引,终点索引),索引从0开始,当只传入一个参数时这个参数作为起点索引,终点索引默认为数组最后一个元素的索引,slice()方法也可以不接收参数,此时相当于复制当前数组并返回副本。slice()方法还有一种经常使用的方法,即将arguments类数组对象转化成真正的数组。
function test(){
var args=Array.prototype.slice.call(arguments);
console.log(Array.isArray(args));
}
test(1,2,3,4);//true
No6.使用splice()的三种方式
- 删除:可以删除任意数量的项,只需指定 2 个参数:要删除的第一项的位置和要删除的项数。例如, splice(0,2) 会删除数组中的前两项。
- 插入:可以向指定位置插入任意数量的项,只需提供 3 个参数:起始位置、 0(要删除的项数)和要插入的项。如果要插入多个项,可以再传入第四、第五,以至任意多个项。例如,splice(2,0,"red","green") 会从当前数组的位置 2 开始插入字符串"red" 和"green" 。
- 替换:可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定 3 个参数:起始位置、要删除的项数和要插入的任意数量的项。插入的项数不必与删除的项数相等。例如,splice (2,1,"red","green") 会删除当前数组位置 2 的项,然后再从位置 2 开始插入字符串"red"和"green"。
问题1:toLocaleString()与toString()有什么不同?
这两个方法都会返回以逗号分隔的字符串,为了创建这个字符串会调用数组每一项的相应方法,也就是说两者唯一的区别是当数组调用toLocaleString()时,为了取得每一项的值,调用的是每一项的toLocaleString()方法,而不是toString()方法.
<script type="text/javascript">
var person1 = {
toLocaleString : function () {
return "Nikolaos";
},
toString : function() {
return "Nicholas";
}
};
var person2 = {
toLocaleString : function () {
return "Grigorios";
},
toString : function() {
return "Greg";
}
};
var people = [person1, person2];
alert(people); //Nicholas,Greg
alert(people.toString()); //Nicholas,Greg
alert(people.toLocaleString()); //Nikolaos,Grigorios
</script>
Q&A
var values=[1,2,3,4];
console.log(values.join(undefined)); //1,2,3,4
var values=[1,2,3,4];
console.log(values.join(null)); //1null2null3null4
var colors = ["red", "green", "blue","yellow","purple"];
var colors2=colors.splice(-2);
console.log(colors); //[ 'red', 'green', 'blue' ]
console.log(colors2); //[ 'yellow', 'purple' ]
var numbers=[1,2,3,4,5,4,3,2,1];
var mapResult=numbers.map(function(item,index,array){
return item*2;
})
var filterResult=numbers.filter(function (item,index,array) {
return item<4;
})
console.log(mapResult);//[ 2, 4, 6, 8, 10, 8, 6, 4, 2 ]
console.log(filterResult);[ 1, 2, 3, 3, 2, 1 ]
console.log(numbers);//[ 1, 2, 3, 4, 5, 4, 3, 2, 1 ]
吃透Javascript数组操作的正确姿势—再读《Js高程》的更多相关文章
- 用 JavaScript 刷 LeetCode 的正确姿势【进阶】
之前写了篇文章 用JavaScript刷LeetCode的正确姿势,简单总结一些用 JavaScript 刷力扣的基本调试技巧.最近又刷了点题,总结了些数据结构和算法,希望能对各为 JSer 刷题提供 ...
- javascript数组操作(创建、元素删除、数组的拷贝)
这篇文章主要介绍了javascript数组操作,包括创建.元素的访问.元素删除.数组的拷贝等操作,还有其它示例,需要的朋友可以参考下 1.数组的创建 复制代码 代码如下: var arrayObj = ...
- RX学习笔记:JavaScript数组操作
RX学习笔记:JavaScript数组操作 2016-07-03 增删元素 unshift() 在数组开关添加元素 array.unshift("value"); array.un ...
- JavaScript 数组操作函数--转载+格式整理
JavaScript 数组操作函数(部分)--转载+格式整理 今天看了一篇文章,主要讲的对常用的Js操作函数:push,pop,join,shift,unshift,slice,splice,conc ...
- Javascript数组操作
使用JS也算有段时日,然对于数组的使用,总局限于很初级水平,且每每使用总要查下API,或者写个小Demo测试下才算放心,一来二去,浪费不少时间:思虑下,堪能如此继续之?当狠心深学下方是正道. 原文链接 ...
- Javascript数组操作(转)
1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...
- javascript数组操作汇总
javascript之数组操作 - 不悔的青春 - 博客园 1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array( ...
- JavaScript 数组操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【原】javascript数组操作
继续我的第二遍<javascript高级程序设计第三版>,今天要做的笔记是array 一.数组的操作 1.数组的创建: var colors= new Array(); //创建一个数组 ...
随机推荐
- get last dirname/filename in a file path argument
$ dirname /home/train/00.incipient_data/data_for_gene_prediction_and_RNA-seq/240_rep2.fastq /home/tr ...
- RabbitMQ headers Exchange
Headers Exchange headers也是一种交换机类型,但是在rabbitmq官网中的教程中并没有说到.资料也很少,但是找一找总会有的. headers与direct的模式不同,不是使用r ...
- 如何在linux环境下搭建github环境
首先安装github # yum install git 完成之后 https://help.github.com/articles/generating-ssh-keys/#platform-lin ...
- Hibernate的session缓存和对象的四种状态
一.session缓存 说session缓存就得说到JAVA对象的生命周期,当没有任何引用指向一个对象时,对象则可以被gc回收,也就是生命周期结束了 而hibernate获取一个对象后,会将对象存入s ...
- 迅雷9、迅雷极速版之迅雷P2P加速:流量吸血鬼?为什么你装了迅雷之后电脑会感觉很卡很卡?
原文地址:http://www.whosmall.com/post/90 关闭极速版迅雷ThunderPlatform.exe进程 ThunderPlatform.exe目的:利用P2P技术进行用户间 ...
- 创建16x16二级hash目录
Hash目录是一种优化文件存储性能的方法.无论是Windows还是Linux,无论是NTFS还是ext4,每个目录下所能容纳的项目数是有限的.并不是不能保存,而是当项目数量过大的时候,会降低文件索引速 ...
- GPS模块数据放入谷歌地图显示,不准
GPS 串口读出的是 DDMM.MMMM格式 一般上位机是 DD.DDDDDD°或 DD°MM'SS" 格式, 这两种都可以在 GE 里直接输入 举例说明: 3147.8749 (示例,经纬 ...
- Sql Server 分区演练 【转】
Sql Server 分区演练 [转] 代码加注释,希望对初学者有用. USE [master]GOif exists (select * from sys.databases where name ...
- codevs3163 抄书问题2
题目描述 Description 现在要把M本有顺序的书分给K个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比 如不能把第一.第三. ...
- tyvj1863 [Poetize I]黑魔法师之门
背景 经过了16个工作日的紧张忙碌,未来的人类终于收集到了足够的能源.然而在与Violet星球的战争中,由于Z副官的愚蠢,地球的领袖applepi被邪恶的黑魔法师Vani囚禁在了Violet星球.为了 ...