javascript基础知识梳理-数组

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>数组</title>
<script type="text/javascript">
	//今天主要学习一下javascript中的数组的知识,前面的基本知识已经差不多了,现在可以学习一些高级的知识了。
	//数组是值的有序集合,每个值叫做一个元素,而每个元素在数组中有个位置,以数字表示,称为索引。数组元素可以使任何类型,并且同一个数组中的不同元素允许有不同的类型。
	var arr = [ 1, 2 ];
	var names = Object.getOwnPropertyNames(arr);
	console.log("Array [1,2] own property names:" + names.toString());
	console.log();
	//创建数组,使用数组直接量创建数组是最简单的方法,在方括号中将数组元素用逗号隔开即可。
	var arr = [];//创建一个空的数组
	//调用构造函数Array()是创建数组的另一种方法,可以用三种方法调用构造函数。
	//1.调用时没有参数var arr = new Array();等同于var arr = [];
	//2.调用时有一个数值参数,它指定了数组的长度
	var arr = new Array(5);
	console.log("arr.length = " + arr.length);
	//3.显示指定两个或者多个数组元素,还不如使用数组直接量呢
	var arr = new Array(1, 2, 3);
	console.log("arr.toString() = " + arr.toString());
	//数组元素的读和写,数组的特别之处在于,当使用小于2的32次方的非负整数作为属性名时数组会自动维护其length。
	console.log("arr['0'] = " + arr["0"]);
	//其实对象内部的属性名称都是使用字符串来维护的,包括数组的索引。只不过用点操作符调用时引擎会判断是否是合法的标识符。
	//稀疏数组,可以使用构造函数或简单的指定数组的索引值大于当前的数组长度来创建稀疏数组。
	var arr = new Array(5);//数组为空,但是length为5
	console.log("arr.length = " + arr.length);
	var arr = [];
	arr[10] = 1;//只有一个元素,但是length是11
	console.log("arr.length = " + arr.length);
	//后面会看到也可以使用delete操作符来产生稀疏数组
	//当在数组直接量中省略值时不会创建稀疏数组,省略的元素在数组中是存在的,其值为undefined,这和数组元素根本不存在还是有区别的,一个索引已经产生了,一个连索引都没有。(书中的这段话有问题,测试发现通过直接量或者构造函数创建的都是稀疏数组)
	var arr = [ 1, , 3 ];//这个会创建一个稀疏数组
	console.log(1 in arr);//返回false,1索引没有产生
	var arr = [ 1, undefined, 3 ];//这个不会是稀疏数组
	console.log(1 in arr);//返回true,1索引产生了
	//每个数组有一个length属性,就是这个属性使其区别于常规的javascript对象,对于稠密数组(非稀疏),该属性代表的是数组中元素的个数,其值比数组中最大的索引大1
	//当数组是稀疏的时,length数值大于数组中元素的个数。数组有两个特殊的行为
	//1.如果给一个数组元素赋值,它的索引i大于或者等于现有数组的长度时,length的值将被设置为i+1;
	//2.如果设置length属性为一个小于或者等于当前数组长度的数值n时,当前数组中那些索引值大于或者等于n的数组元素将被删除。
	var arr = [ 1, 2, 3, 4 ];
	arr.length = 1;//将长度设为1之后,2,3,4被删除
	console.log("arr.toString() = " + arr.toString());
	//在ECMAScript5中,可以使用Object.defineProperty()方法让数组的length属性变成只读的。
	//下面看看数组元素的添加和删除
	//添加数组元素最简单的方法就是:给新索引赋值,也可以使用push方法在数组的末尾添加一个或者元素,在数组末尾压入一个元素相当给arr[arr.length]赋值
	var arr = [ 1, 3 ];
	console.log("arr.toString() = " + arr.toString());
	arr.push(2);
	console.log("arr.toString() = " + arr.toString());
	//可以使用unshift方法在数组的首部插入一个元素
	arr.unshift(0);
	console.log("arr.toString() = " + arr.toString());
	//可以像删除对象属性一样使用delete操作符删除数组元素,使用delete删除数组元素后,数组就变成了稀疏数组,length长度不变
	delete arr[3];
	console.log("arr.toString() = " + arr.toString());
	console.log("arr.length = " + arr.length);
	//正如push方法是在数组尾部添加元素,pop方法从数组尾部删除元素,同时更新数组的length属性,该方法返回被删除的数组元素
	arr.pop();
	console.log("pop arr.toString() = " + arr.toString());
	console.log("pop arr.length = " + arr.length);
	//同理unshift()是在数组头部增加元素,相应的shift()就是在数组头部删除元素了,删除后自动更新length属性和索引
	arr.shift();
	console.log("shift arr.toString() = " + arr.toString());
	console.log("shift arr.length = " + arr.length);
	//还有一个方法splice,用于插入,删除,替换数组元素,后面会讲到。
	//数组元素遍历,可以使用for循环,for/in循环(遍历稀疏数组),使用for/in循环遍历数组的时候不用担心将length属性遍历出来,因为他是不可枚举的。
	var arr = [ 1, 2, 3 ];
	for ( var index in arr) {
		console.log(arr[index]);
	}
	//但是如果数组对象中既有索引属性,又有其他属性,则遍历的时候不能保证能按照索引的顺序来遍历,ECMAScript5提供了遍历数组的新方法。
	//foreach()方法,参数是一个回调函数,回调函数的参数是按照数组索引顺序传入的数组元素
	arr.forEach(function(x) {
		console.log(x);
	});
	//下面看看javascript中的多维数组,多维数组就是数组的数组而已
	var arr = [ [ 1, 2 ], [ 1, 2, 3 ] ];//这就是一个多维数组
	//下面看看数组的方法,在Array.prototype中定义的,之前已经看过一些方法了,比如push(),pop(),shift(),unshift()等等
	//join()方法,该方法会将数组中的每个元素转换成字符串连接在一起,可以指定连接符,如果不指定默认用逗号。这个方法是String的split方法的逆向操作
	var arr = [ 1, 2, 3 ];
	console.log("arr.join('-') = " + arr.join("-"));
	//reverse()方法,从单词意思就可以看书,该方法将数组中的元素倒序,返回的数组和之前的地址相同,不会创建新的数组
	console.log("arr.reverse().join('-') = " + arr.reverse().join("-"));
	//sort()方法,将数组中的元素排序,并返回排序后的数组,排序规则是按照字母表的顺序,会将元素转换成字符串进行比较,同样不会生成新数组。其中值为undefined的元素会被排在数组的末尾。
	//如果要改变数组排序方式,需要传递一个回调方法,回调方法有两个参数都是数组元素,如果返回值小于0,那么第一个参数会排在第二个参数的前面
	var arr = [ 2, 11, 3 ];
	console.log("arr.sort().join() = " + arr.sort().join());
	console.log("按数字从小到大排序:" + arr.sort(function(a, b) {
		return a - b;//按数字从小到大排序
	}).join());
	console.log("按数字从大到小排序:" + arr.sort(function(a, b) {
		return b - a;//按数字从大到小排序
	}).join());
	//concat()方法,该方法创建并返回一个新的数组,新数组的元素包括调用该方法的数组中的元素和方法的每个参数
	//如果方法的参数中包含数组,则连接的是数组中的元素,但是不会递归去连接,即只会遍历一维数组,不会再向下层遍历。
	var arr = [ 1, 2, 3 ];
	arr2 = arr.concat(4, [ 5, 6 ], [ 7, [ 8, 9 ] ]);
	console.log("arr === arr.concat(1) = " + (arr === arr.concat(1)));//返回false,因为返回了新的数组
	console.log("arr.concat(4, [ 5, 6 ], [ 7, [ 8, 9 ] ]).join() = " + arr.concat(4, [ 5, 6 ], [ 7, [ 8, 9 ] ]).join());
	//slice方法返回指定数组的一个片段或者子数组,它的两个参数分别指定了片段的开始和结束的位置,返回的数组包含第一个参数指定的位置和
</script>
</head>
<body>

</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值