资讯专栏INFORMATION COLUMN

《javascript高级程序设计》笔记:数组方法

Aomine / 295人阅读

摘要:如果传递给方法的是一或多个数组,则该方法会将这些数组中的每一项都添加到结果数组中。如果有两个参数,该方法返回起始和结束位置之间的项,但不包括结束位置的项。为了实现排序,方法会调用每个数组项的转型方法,然后比较得到的字符串,以确定如何排序。

将数组转换成字符串

join()能够将数组用指定的字符分割成字符串

方法 用法 变量的值 表达式的值
假设 arr = [1,2,3]
join arr.join() [1,2,3] "1,2,3"
- arr.join(undefined) [1,2,3] "1,2,3"
- arr.join("-") [1,2,3] "1-2-3"
- arr.join(null) [1,2,3] "1null2null3"
- arr.join({}) [1,2,3] "1[object Object]2[object Object]3"

结论:
1.不给 join()方法传入任何值,或者给它传入 undefined,则使用逗号作为分隔符;
2.join()会将传入的参数隐式转换成字符串形式
3.如果数组中的某一项的值是 null 或者 undefined,那么返回的结果中以空字符串表示,toString()也遵循该准则 [1,2,undefined,3].join() ==> "1,2,,3"

toString() / toLocaleString() 也能够将数组转换成字符串;
alert() 方法会隐式调用toString()方法

调用数组的 toString() 方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串;

当调用数组的 toLocaleString() 方法时,它也会创建一个数组值的以逗号分隔的字符串。而与之前方法唯一的不同之处在于,这一次为了取得每一项的值,调用的是每一项的 toLocaleString() 方法,而不是 toString() 方法,下面的例子可以解释这一现象:

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);
alert(people.toString());
alert(people.toLocaleString());
//Nicholas,Greg
//Nicholas,Greg
//Nikolaos,Grigorios
数组的增删操作

1.堆栈方法

方法 用法 变量的值 表达式的值
假设 arr = [1,2,3]
push arr.push(4,5) [1,2,3,5] 4
- 接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度
pop arr.pop() [1,2] 3
- arr.pop(123) [1,2] 3
- 从数组末尾移除最后一项,减少数组的 length 值,然后返回移除的项(有参忽略)
unshift arr.unshift(4,5) [4,5,1,2,3] 5
- 接收任意数量的参数,把它们逐个添加到数组首端,并返回修改后数组的长度
shift arr.shift() [2,3] 1
- 从数组首端移除第一项,减少数组的 length 值,然后返回移除的项(有参忽略)

2.concat方法

concat()方法可以基于当前数组中的所有项创建一个新数组。具体来说,这个方法会先创建当前数组一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组。

1.在没有给 concat()方法传递参数的情况下,它只是复制当前数组并返回副本。
2.如果传递给 concat()方法的是一或多个数组,则该方法会将这些数组中的每一项都添加到结果数组中。
3.如果传递的值不是数组,这些值就会被简单地添加到结果数组的末尾
4.arr === arr.concat() 为false

方法 用法 变量的值 表达式的值
假设 arr = [1,2,3]
concat arr.concat() [1,2,3] [1,2,3]
- arr.concat(4,5) [1,2,3] [1,2,3,4,5]
- arr.concat(4,5,[6,7]) [1,2,3] [1,2,3,4,5,6,7]

3.slice方法

slice()方法用于数组的截取,可以接受一或两个参数,即要返回项的起始和结束位置;

1.没有参数时,会创建一个副本,但arr !== arr.slice()
1.在只有一个参数的情况下,slice()方法返回从该参数指定位置开始到当前数组末尾的所有项。
2.如果有两个参数,该方法返回起始和结束位置之间的项,但不包括结束位置的项
3.如果 slice()方法的参数中有一个负数,则用数组长度加上该数来确定相应的位置
4.如果结束位置小于起始位置,则返回空数组。

方法 用法 变量的值 表达式的值
假设 arr = [1,2,3,4,5]
slice arr.slice() [1,2,3,4,5] [1,2,3,4,5]
- arr.slice(1) [1,2,3,4,5] [2,3,4,5]
- arr.slice(1,4) [1,2,3,4,5] [2,3,4]
- arr.slice(-2,-1) [1,2,3,4,5] [4]
- arr.slice(4,3) [1,2,3,4,5] []

4.splice方法

splice(删除的第一项索引,删除元素个数,插入的内容...)
splice()的主要用途是向数组的中部插入项,但使用这种方法的方式则有如下 3 种:

1.删除:可以删除任意数量的项,只需指定 2 个参数:要删除的第一项的位置和要删除的项数
2.插入:可以向指定位置插入任意数量的项,只需提供 3 个参数:起始位置、0(要删除的项数)和要插入的项。如果要插入多个项,可以再传入第四、第五,以至任意多个项
3.替换:可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定 3 个参数:起始位置、要删除的项数和要插入的任意数量的项。插入的项数不必与删除的项数相等

splice()方法始终都会返回一个数组,该数组中包含从原始数组中删除的项(如果没有删除任何 项,则返回一个空数组)

方法 用法 变量的值 表达式的值
假设 arr = [1,2,3,4,5]
splice arr.splice() [1,2,3,4,5] []
- arr.splice(1) [2,3,4,5] [1]
- arr.splice(1,2) [1,4,5] [2,3]
- arr.splice(-2,2) [1,2,3] [4,5]
- arr.splice(1,2,"a","b","c","插入") [1,"a","b","c","插入",4,5] [2,3]
- arr.splice(1,1,"替代") [1,"替代",3,4,5] [2]
数组排序

1.reverse()方法

数组反转,数组自身改变,并返回反转后的值

方法 用法 变量的值 表达式的值
假设 arr = [1,2,3,4,5]
reverse arr.reverse() [5,4,3,2,1] [5,4,3,2,1]

2.sort()方法
参考:js中sort()方法的用法,参数以及排序原理

在默认情况下(没有参数),sort()方法按升序排列数组项——即最小的值位于最前面,最大的值排在最后面。 为了实现排序,sort()方法会调用每个数组项的 toString()转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值,sort()方法比较的也是字符串

因此,会出现下面这种情况:

var arr1 = ["George", "John", "Thomas", "James", "Adrew", "Martin"];
arr.sort(); // ["Adrew", "George", "James", "John", "Martin", "Thomas"]

var arr2 = ["10", "5", "40", "25", "1000", "1"];
arr.sort(); // ["1", "10", "1000", "25", "40", "5"] 

如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91403.html

相关文章

  • javascript高级程序设计笔记:检测数组方法

    摘要:如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。 如何检测某个变量是否为数组? 《javascript 高级程序设计》原文摘录: 自从 ECMAScript 3 做出规定以后,就出现了确定某个对象是不是数组的经典问题...

    wums 评论0 收藏0
  • JavaScript高级程序设计-摘要笔记-1

    摘要:说明此摘要笔记系列是我最近看高级程序设计第版随手所记。摘要笔记本身没有系统性,没有全面性可言,写在这里供有一定基础的前端开发者参考交流。对每一项运行给定函数,返回该函数会返回的项组成的数组。是的反操作是的反操作第一部分结束。 说明: 此摘要笔记系列是我最近看《JavaScript高级程序设计(第3版)》随手所记。 里面分条列举了一些我认为重要的、需要记下的、对我有帮助的点,是按照我看...

    chavesgu 评论0 收藏0
  • 读书笔记(01) - JSON - JavaScript高级程序设计

    摘要:用于把对象序列化字符串,在序列化对象时,所有函数及原型成员都会被有意忽略,不体现在结果中。对第步返回的每个值进行相应的序列化。参考文档高级程序设计作者以乐之名本文原创,有不当的地方欢迎指出。 showImg(https://segmentfault.com/img/bVburW1?w=658&h=494); JSON与JavaScript对象 JSON是一种表示结构化数据的存储格式,语...

    mengbo 评论0 收藏0
  • javascript高级程序设计笔记_数组 稀疏数组数组

    摘要:数组是数据的有序列表,与其他语言不同的是,数组的每一项可以保存任何类型的数据。如下的代码创建的就是一个密集数组稀疏数组与密集数组相反,并不强制要求数组元素是紧密相连的,即允许间隙的存在。 数组是数据的有序列表,与其他语言不同的是,ECMAScript 数组的每一项可以保存任何类型的数据。也就是说,可以用数组的第一个位置来保存字符串,用第二位置来保存数值,用第三个位置来保存对象, 以此类...

    pepperwang 评论0 收藏0
  • JavaScript高级程序设计》读书笔记

    摘要:为了每个对象都能通过来检测,需要以或者的形式来调用,传递要检查的对象作为第一个参数,称为。对象都是动态的,这就意味着每次访问对象,都会运行一次查询。是语言中立的用于访问和操作和文档。 一、第三章 基本概念: 1.理解参数 1.1 可以向函数中传递任意数量的参数,并且可以通过arguments对象来访问这些参数。 1.2 arguments对象只是类似数组,它通过length来确定传进来...

    dayday_up 评论0 收藏0
  • 《你不知道的javascript笔记_对象&原型

    摘要:上一篇你不知道的笔记写在前面这是年第一篇博客,回顾去年年初列的学习清单,发现仅有部分完成了。当然,这并不影响年是向上的一年在新的城市稳定连续坚持健身三个月早睡早起游戏时间大大缩减,学会生活。 上一篇:《你不知道的javascript》笔记_this 写在前面 这是2019年第一篇博客,回顾去年年初列的学习清单,发现仅有部分完成了。当然,这并不影响2018年是向上的一年:在新的城市稳定、...

    seasonley 评论0 收藏0

发表评论

0条评论

Aomine

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<