JavaScript 数组详解

数组是值的有序集合。每个数组里的值叫做数组元素,而每个数组元素都有与之对应的数字下标,也称之为索引。JavaScript是弱类型的语言,数组中的元素可以是任意类型的元素,比如数组中可以包含其它数组或对象。下面举个栗子:

var arr = [1, ‘string‘, true, {x:1}, [1,2,3], null, undefined];
//获取数组元素
arr[0]; // 1
arr[1]; // ‘string‘
arr[2]; // true
arr[3]; // {x:1}
arr[3].x; // 1
arr[4][1]; // 2
arr[5]; // null
arr[6]; // undefined

比较特别的:

var arr = [1,,2];
arr   // 1,undefined,2
var arr = [,,,]
arr   // undefined × 3

数组默认最大长度为 2³² -1,超出这个长度将会报错:

var arr = new Array(4294967295);
arr.length    // 4294967295
var arr = new Array(4294967296); //Invalid array length

数组如果以构造函数方式创建,里面的参数可以为数字,也可以为数组:

var arr = new Array(5);  //undefined × 5
//或者以数组形式加入
var arr = new Array(1,2,true,‘string‘);
arr    //[1, 2, true, "string"]

数组元素写入和删除:

var arr = [1,2,3];
arr.length  // 3
arr[3] = 4;    //向数组添加一个元素
arr    //[1,2,3,4]
delete arr[3];   //true
arr[3]    //undefined
//push,unshift方法添加元素
var arr = [];
arr.push(1);
arr    // [1]
arr.push(2,3);
arr    //[1,2,3]
arr[arr.length] = 4;    //相当于push方法往数组的最后添加元素
arr.unshift(0);   //往数组的最前面添加元素0
arr    //[0,1,2,3,4]
delete arr[1];
arr    //[0, undefined, 2, 3, 4]
arr.length    //5    元素已经被删除,数组的长度还是保持不变
1 in arr;   //false  元素1已经不存在
arr.length -= 1; //4
arr    //[0, undefined, 2, 3]     元素4已经被移除
arr.length;    //4      长度也相应的减少
//pop,shift方法移除元素
arr.pop();    //3    显示被删除的元素3
arr    //[0, undefined, 2]    数组的最后一个元素被删除
arr.shift();   //0    显示被删除的元素0
arr     //数组的第一个元素被删除
 

假如我们往数组对象的原型上添加一个元素,那么这个元素会在for  in 循环里出现,再这里说点题外话,for in是用来循环带有字符串key的对象的方法,不推荐用for in 来循环数组,不过在ES6中我们可以使用for of来循环数组,它的功能和for in相似,但是它很好的弥补了for in的缺陷:

var arr = [1,2,3];
Array.prototype.name = ‘animal‘;
for (var i in arr){
     console.log(arr[i]);    //1,2,3,‘animal‘
}
//可以使用hasOwnProperty方法来检测该属性是否存在当前数组来弥补
for (var i in arr){
    if (arr.hasOwnProperty(i)) {
        console.log(arr[i]);    //1,2,3
     }
}
//也可以使用for of
for (var value of arr){
     console.log(value);    //1,2,3
}

下面来讲讲数组的方法,数组包含了许多自带的方法,如sort,join,concat,slice等等,一起来看下它们的功能:

var arr = [1,2,33];
//数组检索   indexOf(从左向右)  lastIndexOf(从右向左)
var arr = [1,2,3,4,3,2,5];
arr.indexOf(3);  //2   第一个参数为要查找的元素,并返回该元素的索引值
arr.indexOf(10);   //-1   如果没有该元素则返回 -1
arr.indexOf(3,2);   //4   第二个参数规定在何处开始查找
arr.indexOf(2,-3);   //5   也可以为负数,-3 表示末尾往左第三个位置
//将数组转化为字符串
arr.join();    // "1,2,33"
arr.join(‘-‘);    // "1-2-33"
arr.join(‘‘);    // "1233"
//将数组逆序排列
arr.reverse();    //[33, 2, 1]
arr    //[33, 2, 1]    原数组也被修改
//数组排序
var arr = ["c","b","d","a"];
arr.sort();    //["a","b","c","d"]
var arr = [1,33,6,20];
arr.sort();    //[1, 20, 33, 6]
//如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。所以上面的数字并没有按照我们所想要的按数字大小排序。如果想按数字大小排序,就要用sort方法里加参数。 注意:sort方法也会改变原数组而不会重新生成一个新副本。
arr.sort(function(a,b){
    return a - b;   //[1, 6, 20, 33]
})
//sort方法将比较两个数字的大小,函数提供两个参数。若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。若 a 大于 b ,则返回一个大于 0 的值。如果 a 等于 b ,则返回0。
//当数组里面包含对象,比如存储每个学生的分数并按成绩由高到低排序
var arr = [{name:‘张三‘, score:67},{name:‘李四‘, score:98},{name:‘王五‘, score:75}];
arr.sort(function(a,b){
     return b.score - a.score;
})
arr.forEach(function(val){
     console.log(val.score);    //98,75,67
})
//数组合并
var arr = [1,2,3];
arr.concat(4,5);    //[1,2,3,4,5]
arr    //[1,2,3]     原数组未被修改
arr.concat([11,12],13);  //[1, 2, 3, 11, 12, 13]  还是一维数组
arr.concat([[11,12],13]);   //[1, 2, 3, [11, 12], 13]  变成二维数组了
//返回选定的元素
var arr = [1,2,3,4,5];
arr.slice(2,4);    //[3,4]
arr    //[1,2,3,4,5]   原数组不会被修改
arr.slice(1,-1);    //[2, 3, 4]
//slice方法第一个参数为数组的下标,表示从哪里开始选取,第二个参数可选,表示从哪里结束选取,不填则一直选取到数组末尾。-1表示数组末尾的第一个元素。
//splice方法表示 数组删除/拼接元素,然后返回被删除的项目
var arr = [1,2,3,4,5];
arr.splice(3);    //[4,5]    // 3 表示从数组的何处开始删除并返回被删除的元素
arr    //[1, 2, 3]
var arr = [1,2,3,4,5];
arr.splice(3,1);    //[4]  第二个参数表示要删除元素个数
var arr = [1,2,3,4,5];
arr.splice(2,2,‘a‘,8);    //[3,4]   返回被删除的元素,并向数组添加新的元素
arr   //[1, 2, "a", 8, 5]
//forEach数组遍历
var arr = [1,2,3];
arr.forEach(function(value, index, o){
    console.log(value+‘,‘+index+‘,‘+(o===arr));
})
//输出结果  三个参数分别为数组元素,元素的索引,数组本身
//1,0,true
//2,1,true
//3,2,true
//map数组映射
var arr = [1,2,3];
arr.map(function(x){
    return x * 10;    //[10, 20, 30]   每个数组元素会乘以10
})
arr     //[1,2,3]   原数组不会改变
//filter数组过滤
var arr = [1,2,3,4,5,6,7,8,9,10];
arr.filter(function(x, index){
     return x <3 || x >=8;    //[1, 2, 8, 9, 10]  过滤筛选出你需要的元素
})
arr     //[1,2,3,4,5,6,7,8,9,10]   原数组不会改变
//every,some数组判断
var arr = [1,2,3,4,5];
arr.every(function(x){
    return x < 10;    //true    数组中所有元素都必须满足条件
})
arr.every(function(x){
    return x < 2;    //false    数组中只要有一个元素不满足条件
})
arr.some(function(x){
    return x < 2;    //true    数组中只要有一个元素满足条件
})
arr.some(function(x){
    return x > 10;    //false    数组中所有元素都不满足条件
})
arr     //[1,2,3,4,5]   原数组不会改变
//reduce数组的两个值(从左到右)应用
var arr = [1,2,3,4,5];
arr.reduce(function(x,y){
    return x + y;    //15
})
arr.reduce(function(x,y){
    return x + y;    //20   后面一个参数表示从该值开始相加
},5)
arr     //[1,2,3,4,5]   原数组不会改变

最后,边看边动手练习才能更好的理解每个方法。

时间: 2024-11-03 21:47:22

JavaScript 数组详解的相关文章

javascript数组详解(js数组深度解析)

Array 对象是一个复合类型,用于在单个的变量中存储多个值,每个值类型可以不同. 创建数组对象的方法: new Array(); new Array(size); new Array(element0, element1, ..., elementn); 1. 当索引值为负数时,会将其看作是对象的一个属性,若为非负的数字字符串,则会隐式转换为数字索引: var a= new Array(); a[-1.23]=true; a[1]="pomelo"; a["100"

JavaScript事件详解-zepto的事件实现

zepto的event 可以结合上一篇JavaScript事件详解-原生事件基础(一)综合考虑源码暂且不表,github里还有中文网站都能下到最新版的zepto.整个event模块不长,274行,我们可以看到,整个event模块,事件绑定核心就是on和off,还有一个trigger用来触发,类观察者模式,可以先看看汤姆大叔的深入理解JavaScript系列(32):设计模式之观察者模式,其余皆为实现的处理函数.首先来个demo: $("#btn").on("click&quo

javascript 函数详解2 -- arguments

今天我们接着上篇文章来继续javascript函数这个主题.今天要讲的是函数对像中一个很重要的属性--arguments. 相关阅读: javascript 函数详解1 -- 概述 javascript 函数详解2 -- arguments Javascript 函数详解3 -- this对象 Javascript 函数详解4 -- 函数的其他属性 Javascript 函数详解5 -- 函数对象的内部函数 arguments对象参数数组引用 arguments是函数对象内部一个比较特殊的类数组

JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 exec方法的返回值 exec方法返回的其实并不是匹配结果字符串,而是一个对象,简单地修改一下execReg函数,来做一个实验就可以印证这一点: function execReg(reg, str) { var result = reg.exec(str); alert(typeof result

javascript运动详解

javascript运动详解 本文给大家详细介绍下如何使用javascript来实现运动效果,总结的十分全面,附上各种效果的详细示例和演示图,有需要的小伙伴可以参考下. 物体运动原理:通过改变物体的位置,而发生移动变化. 方法: 1.运动的物体使用绝对定位 2.通过改变定位物体的属性(left.right.top.bottom)值来使物体移动.例如向右或左移动可以使用offsetLeft(offsetRight)来控制左右移动. 步骤: 1.开始运动前,先清除已有定时器 (因为:是连续点击按钮,

javascript事件详解笔记

javascript事件详解笔记: 一.事件流 1.事件流: 描述的是页面中接受事件的顺序,有事件冒泡.事件捕获两种. 2.事件冒泡: 由最具体的元素接收,然后逐级向上传播到最不具体的元素的节点(文档). 3.事件捕获: 最不具体的节点先接收事件,而最具体的节点应该是最后接收事件. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>事件</title&

BIT 树状数组 详解 及 例题

(一)树状数组的概念 如果给定一个数组,要你求里面所有数的和,一般都会想到累加.但是当那个数组很大的时候,累加就显得太耗时了,时间复杂度为O(n),并且采用累加的方法还有一个局限,那就是,当修改掉数组中的元素后,仍然要你求数组中某段元素的和,就显得麻烦了.所以我们就要用到树状数组,他的时间复杂度为O(lgn),相比之下就快得多.下面就讲一下什么是树状数组: 一般讲到树状数组都会少不了下面这个图: 下面来分析一下上面那个图看能得出什么规律: 据图可知:c1=a1,c2=a1+a2,c3=a3,c4

JavaScript prototype 详解(对prototype 使用的一些讲解)

对JavaScript有一定了解的你,对jquery不陌生吧,那你看jQuery源代码的时候对prototype 也一定有见过,如果对prototype有疑问或者想更深入的去了解与使用它,欢迎你继续往下阅读. 最初的用法是, 为了避免方法在构造器里随机数据被实例化时而产生重复的副本  后来被用在"继承"上面了, 注意, JS语义上是没有继承的, 这里说的是人为的实现.对于下面对JavaScript中类型名称叫做"对象"."函数"."类型

Javascript学习--------详解window窗口对象

对话框: 警告对话框:alert(): 语法:window.alert(src)或者alert(src); 询问回答对话框:confirm(): 语法:window.confrim(question)或者confrim(question); 单击确认,返回true: 单击取消,返回false 提示对话框:prompt(): 语法:window.prompt([showtxt],[defaultTxt])或者prompt([showtxt],[defaultTxt]); 单击确认,返回输入的文本: