JavaScript初探 (三)

JavaScript数组

定义

创建数组

  • var 数组名 = [元素0,元素1,元素2,……] ;
var arr = ["Huawei","China","Mirror"];

同时JavaScript也支持 new Array 创建数组。但是建议使用上面的文本方式创建数组

数组访问

  • 通过引用 索引号(下标) 来引用某个数组元素
var name = arr[0];
// name = Huawei

ps:数组的索引是从 0 开始的

  • 可以直接使用数组名不加索引属性,直接访问所有数组内容
var arr = ["Huawei","China","Mirror"];
document.getElementById("demo").innerHTML = arr ;
// 结果输出: Huawei,China,Refueling

更新数组元素

  • 直接使用数组索引赋值方式,就可更改数组内元素

数组是对象

  • typeof arr_name 会返回 object

    JavaScript的数组实际上是一种对象的表现,但是

    数组最好还是以数组方式来描述

  • 两者的区别:

    • 数组是利用索引位置访问数组内容属性的
    • 对象是利用对象属性名来访问属性名对象的属性值的
  • 数组元素可以是对象:

    由于数组的特点,数组是特殊类型的对象

    故此,可以在数组中存放不同类型的变量

    可以数字、字符串、函数、函数……

    而且,还可以在数组中存储另一个数组

数组属性

length属性
  • length:返回数组的长度(数组的元素数目)
var arr = ["Huawei","China","Mirror"];
arr.length;
// 结果:返回 3

由于arr索引是从零开始,而length数目计算是从1开始的

所以length-1 === 数组最后一个元素的下标索引

  • 访问数组最后一个元素的技巧:
var arr[arr.length - 1] ;
// 结果返回 Mirror
遍历数组
  • 遍历数组理论上最好的是使用 for 循环
var arr = ["Huawei","China","Mirror"];
var text = "<ul>";
for(i = 0 ; i < arr.length-1 ; i ++){
text += "<li>" + arr[i] + "</li>";
}
Array.foreach()
var arr = ["Huawei","China","Mirror"];
var text ;
text = "<ul>";
arr.forEach(myArr);
text += "</ul>";
function myArr(value){
text += "<li>" + value + "</li>";
}
添加元素:push()
  • push():向数组添加新元素的最佳方法就是push()方法
var arr = ["Huawei","China","Mirror"];
arr.push("Refueling");
  • 手动添加元素
arr[arr.length] = ("Refueling");
// 或者
arr[x] = ("Refueling");
关联数组
  • 在JavaScript中只支持数字索引;并不支持命名索引方法
var arr = [];
arr[0] = "Huawei";
arr[1] = "China";
arr[2] = "Refueling";
var x = arr.length ; //返回 3
var y = arr[0]; //返回 Huawei
  • 如果使用了命名索引,则会把数组重定义为 对象
var arr = [];
arr["A"] = "Huawei";
arr["B"] = "China";
arr["C"] = "Refueling";
var x = arr.length ; // 返回 0
var y = arr[0] ; //返回 undefined
对象和数组的区别
  • 在JavaScript中,数组 使用数字索引

  • 在JavaScript中,对象使用命名索引

  • 对象和数组的不同应用

    如果希望元素名为字符串(文本),则使用对象

    如果希望元素名数字,则使用数组

  • 避免 new Array()

    没有必要使用内建数组构造器 new Array()

识别数组变量
  • 我们用 typeof 判断数组数据类型的时候,会返回 object ,因为数组是特殊的对象,但是还是区分不了对象和数字变量。我们可以使用数组的内建:Array.isArray()方法

数组方法

toString() 数组输出
  • 将数组转为字符串值输出(元素间逗号分隔)
var arr = ["Huawei","China","Mirror"];
document.getElimentById("demo").innerHTML = arr.toString();
// 结果:Huawei,China,Mirror
join() 数组输出
  • join(c):将所有数组元素结合为一个字符串;同时还可以规定分隔符 c
var arr = ["Huawei","China","Mirror"];
document.getElimentById("demo").innerHTML = arr.join("&");
// 结果:Huawei&China&Mirror
Popping()(删除元素)
  • pop():从数组中删除最后一个元素
var arr = ["Huawei","China","Mirror"];
arr.pop(); //删除最后一个元素 Mirror

pop():返回被删除的那个数

Pushing()(添加元素)
  • push():在数组的最后一个数组元素,向数组后添加一个新元素
var arr = ["Huawei","China","Mirror"];
arr.push("Refueling"); // 添加 Refueling到数组中,并返回最新数组的长度

push():返回新数组的长度

位移元素(开头元素添/删)
  • shift():删除首个数组元素,并把所有其他元素”位移“到更低的索引
var arr = ["Huawei","China","Mirror"];
arr.shift(); // 返回 Huawei

shift() 返回被移出(删除)的元素

  • unshift():在数组开头添加元素 ,并把所有其他元素向后”位移“索引标志
var arr = ["Huawei","China","Mirror"];
arr.unshift("Refueling"); // 返回 新的数组长度 5

unshift():返回新的数组长度

更改元素
  • 通过对应的索引号引用直接赋值,来改变该索引位置的元素内容
删除元素 delete
  • JavaScript 数组属于对象类型,其中的元素可以使用 JavaScript delete 运算符来删除
var arr = ["Huawei","China","Mirror"];
delete arr[0]; //把 "Huawei" 改为 undefined

不建议使用delete运算符,可以使用pop() 或 shift() 代替

原因:后者的数组方法,会自动抹除数组索引,而delete则会保留索引并导致空洞

拼接数组 splice()
  • splice():用于向数组添加新项
var arr = ["Huawei","China","Mirror"];
arr.splice(2,0,"Refueling","Hello");

第一个参数:定义添加新元素的位置

第二个参数:定义应删除多少元素

其余参数:定义要添加的新元素

  • splice():删除元素
var arr = ["Huawei","China","Mirror"];
arr.splice(0,1); // 删除 arr 数组中的第一个元素

第一个参数:定义新元素添加的元素

第二个参数:定义删除多个元素

其余参数: 被忽略,没有新元素添加

splice()会返回被删除的元素

而原数组的内容就会被修改

合并数组 concat()
  • concat():通过合并(连接)现有数组来创建一个新数组
var str1 = ["Huawei","Refueling"];
var str2 = ["China","Refueling"];
var myStr = str1.concat(str2) ; // 连接 str1 和 str2

Array1.concat(Array2,……)

同样的,concat()也可以和数值合并

array1.concat([值,……])

裁剪数组 slice()
  • slice():裁剪数组的某个片段,返回一个新的数组
var arr = ["Huawei","China","Refueling","Hello","World"];
var array = arr.slice(1);
var array = arr.slice(1,3);

第一个元素:裁剪的开始位置

第二个元素:裁剪的结束位置

若第二个元素被省略,

则从开始的位置截取到数组的最后一个元素


JavaScript数组排序

排序 sort()

  • sort():按照ASCII顺序对数组(字符和数字)进行升序排序
var arr = ["Huawei","China","Refueling","Hello","World"];
arr.sort();
// 结果:China,Hello,Huawei,Refueling,World

反转数组 reverse()

  • reverse() :将数组中的所有元素反转
var arr = ["Huawei","China","Refueling","Hello","World"];
arr.reverse()
  • 利用 sort() + reverse() 对数组进行降序排序
var arr = ["Huawei","China","Refueling","Hello","World"];
arr.sort();
arr.reverse();

比值函数 *

  • 比较函数目的是定义另一种排序顺序

  • 比较函数应该返回一个负、零或正值,这取决于参数

function(a,b){return a-b}

sort() 函数比较两个值时,会将值发送到比较函数,并根据返回的值,对这些值进行排序。

  • 实例:

    当比较 40 和 100 时,sort() 方法会调用比较函数 function(40,100)

    该函数计算 40 - 100 ,然后返回一个 负值

    排序函数将40排序为比100更低的值

    <div>
<button onclick="myFunction1()">字母顺序</button>
<button onclick="myFunction2()">数字顺序</button>
<p id = "demo"></p>
</div>
<script>
var points = [40,100,1,5,25,10] ;
document.getElementById("demo").innerHTML = points ; function myFuntion1() {
points.sort();
document.getElementById("demo").innerHTML = points ;
} function myFuntion2() {
points.sort(function(a,b){return a - b}) ;
document.getElementById("demo").innerHTML = points ;
}
</script>

以随机顺序排序

var points = [40,100,1,5,25,10] ;
points.sort(function(a,b){return 0.5 - Math.random()});

原理就是:0.5减去一个随机数

查找最值

Math.max()

  • Math.max.apply:查找数组中的最高值
function myArrayMax(arr) {
return Math.max.apply(null,arr);
}

Math.max.apply([1,2,3]) === Math.max(1,2,3)

Math.min()

  • Math.min.apply:查找数组中的最小值
function myArrayMin(arr) {
return Math.min.apply([null,arr]);
}

Math.min.apply([1,2,3]) === Math.min(1,2,3)

自定义的max和min

function myArrayMax(arr) {
var len = arr.length ;
var max = -Infinity ; //最小的负值
while (len --) {
if (arr[len] > max) {
max = arr[len] ;
}
}
return max ;
}
function myArrayMin(arr) {
var len = arr.length ;
var min = Infinity ;
while (len --) {
if (arr[len] < min) {
min = arr[len];
}
}
return min ;
}

排序对象数组

  • JavaScript 数组的定义中,是允许存储对象的;
var cars = [
{name:"HUAWEI",age:"good"},
{name:"MI",age:"where"},
{name:"Java",age:"No:1"}
];

即使对象拥有不同数据类型的属性,sort()方法仍然可以对数组进行排序

解决方法就是利用比较函数对比属性值

cars.sort(function(a,b){return a.year - b.year});

通过比较函数,将属性中的属性值内容进行对比


JavaScript 数组迭代方法

Array.forEach()

  • forEach():为每个数组元素调用一次函数(回调函数)
var txt = "" ;
var number = [45,4,9,16,25] ;
numbers.forEach(myFunction) ; function myFunction (value , index , array) {
txt += value + "<br>" ;
}
  • 注释:

    • 项目值
    • 项目索引
    • 数组本身

上述代码的作用:数组中每个值传递并调用函数

Array.map()

  • map():通过对每个数组元素执行函数来创建数组
  • map():不会对没有值的数组元素执行函数
  • map():不会改变原始数组
var number1 = [45,4,9,16,25] ;
var number2 = number1.map(myFunction) ;
function myFunction(value,index,array){
return value * 2 ; // 数组中的元素 * 2 并返回
}
  • 注释:

    • 项目值
    • 项目索引
    • 数组本身

Array.filter()

  • filter():创建一个包含通过测试的数组元素的新数组
var number = [45,4,9,16,25] ;
var over18 = number.filter(myFunction) ;
function myFunction(value , index , array){
return value > 18 ; // 返回大于18的数组元素并组成一个新数组
}
  • 注释:

    • 项目值
    • 项目索引
    • 数组本身

Array.reduce()

  • reduce():在每个数组元素上运行函数,生成单个值;方法在数组中从左到右运行;不会改变原始的数组。
var number = [45,4,9,16,25] ;
var sum = number.reduce(myFunction) ;
function myFunction(total , value , index , array){
return total + value ;
}
  • 注释:

    • 总数(初始值/先前返回的值)
    • 项目值
    • 项目索引
    • 数组本身

reduce():方法能够接收一个初始值

Array.reduceRight()

  • reduce() 类似

Array.every()

  • every():检查所有数组值是否可以通过测试
var number = [45,4,9,16,25] ;
var allOver18 = number.every(myFunction) ;
function myFunction(value , index , array) {
return value > 18 ;
}

Array.some()

  • some():检查某些数组值是否通过测试
var number = [45,4,9,16,25] ;
var someOver18 = number.some(myFunction) ;
function myFunction(value , index , array) {
return value > 18 ;
}

Array.indexOf()

  • indexOf():在数组中搜索元素值并返回其位置
var number = [45,4,9,16,25] ;
var a = number.indexOf(45);

array.indexOf(item,start)

​ item:必须,要检索的项目

​ start:可选,检索的起点

未找到项目,返回 -1

如果搜索的内容出现多次,则返回第一个出现的位置

Array.lasIndexOf()

  • lasIndexOf():和indexOf()功能类似,不同的是,从数组结尾开始搜索

Array.find()

  • find():返回通过测试函数的第一个数组元素的值
var number = [45,4,9,16,25] ;
var first = number.find(myFunction) ;
function myFunction(value , index , array) {
return value > 18 ;
}

Array.findIndex()

  • findIndex():返回通过测试函数的第一个数组元素的下标索引
var number = [45,4,9,16,25] ;
var first = number.findIndex(myFunction) ;
function myFunction(value , index , array){
return value > 18 ;
}

JavaScript初探 三 (学习js数组)的更多相关文章

  1. 初探JavaScript(三)——JS带我"碰壁"带我飞

    已经写了两篇关于小白的JavaScript之行,不可否认,每一种语言都有其精华与糟粕之处,来不及细细体味其精华奥妙,也没法对其评头论足,只能先了解,后深入.到目前为止已经看完<JavaScrip ...

  2. JavaScript初探三

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  3. JavaScript初探之字符串与数组

    一直在研究JS以至于忘记跟新博客... 字符串:// str.charAt(x); //获取下标为x的字符// str.indexOf(",",1); //获取",&qu ...

  4. 廖雪峰官网学习js 数组

    indexOf( )    某字符的位置 slice 相当于string 的substring 切片 a = ['a','b',1,2,3] (5) ["a", "b&q ...

  5. JavaScript学习(一) —— 环境搭建与JavaScript初探

    1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...

  6. 学习javascript数据结构(三)——集合

    前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者 ...

  7. 初探JavaScript(二)——JS如何动态操控HTML

    除去五一三天,我已经和<JavaScript Dom编程艺术>磨合了六天,第一印象很好.慢慢的,我发现这是一块排骨,除了肉还有骨头.遇到不解的地方就会多看几遍,实在不懂的先跳过,毕竟,初次 ...

  8. javaScript数组的三种属性—数组索引、数组内置属性、数组自定义属性

    JS数组也是一种对象. 我们用JavaScript处理的所有东西,都可以视为是一种对象. JavaScript中有两种数据类型,基本类型数对象类型,但是基本类型基本都是包括在对象类型之中的. 数组.函 ...

  9. JavaScript的使用以及JS常用函数(JS 遍历数组和集合)

    JavaScript入门 学习总结 1. 什么是 JavaScript 2. JavaScript 的特点 3. JS的使用 编写位置 基本语法 变量 打印变量 数据类型 innerHTML和inne ...

随机推荐

  1. 在Asp.Net或.Net Core中配置使用MarkDown富文本编辑器有开源模板代码(代码是.net core3.0版本)

    研究如何使用Markdown你们可能要花好几天才能搞定,但是看我的文章或者下载了源码,你搞定一般在10分钟之内.我先给各位介绍下它: Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯 ...

  2. 使用NodeJS模块-第三方提供的模块(什么是npm)

    第三方开发者提供的模块 第三方模块是由NodeJS社区或第三方个人开发的功能模块,这些功能模块以软件包的形式存在.被发布在npmjs注册表中.npmjs是一个注册中心,所有软件包的信息都会被记录到该注 ...

  3. Django源码安装xadmin报错Apps aren't loaded yet.

    环境:python2.7, django1.9 1.报错django.core.exceptions.AppRegistryNotReady:Apps aren't loaded yet.如下图所示: ...

  4. opensciencegrid - GridFTP 安装

    最近配置一个GridFTP 用于测试其传输FTP性能, 在这里简单记录,备忘:使用本教程可以简单起一个GridFTP用于测试服务: 预配置环境: 测试系统:CentOS 7 1806 配置Yum仓库: ...

  5. Linux—修改文件权限、文件拥有者以及文件所在组

    修改文件权限——chmod 修改文件拥有者——chown 修改文件所属组群——chgrp

  6. android 完全区分double-tap 与 singal-tap 的方法

    需求:viewpager显示图片,需要在双击时对图片进行缩放,单击时在屏幕下方弹出popwindow,由于android的双击本质就是两次单击,但是又不想在双击时触发单击时的动作,所以就在网上各种搜解 ...

  7. 定义私有指令 v-fontweight

    // 这是一个私有的指令 他是在vm这个实例对象里里面的 所以说是私有的 directives 多一个s // 在css中是font-Weight.在第二个字母的大写该为小写,去掉横线. // 这中写 ...

  8. Educational Codeforces Round 76 (Rated for Div. 2)

    传送门 A. Two Rival Students 签到. Code /* * Author: heyuhhh * Created Time: 2019/11/13 22:37:26 */ #incl ...

  9. 【ECNU71】一个游戏(水题)

    点此看题面 大致题意: \(n\)种元素,有若干组将\(x\)元素转化为\(y\)元素的操作.问对于所有可能的元素拥有状况,改变转化操作的顺序,是否会影响转化后最终的结果. 水题 虽说是这么水的题,但 ...

  10. __doc__

    目录 一.__doc__ 一.__doc__ 返回类的注释信息 class Foo: '我是描述信息' pass print(Foo.__doc__) 我是描述信息 该属性无法被继承 class Fo ...