JavaScript学习——进阶(续3:数组)

数组

  • 对象的几种创建方式:
    字面量
    系统自带的构造函数
    自定义构造函数
    Object.create()
  • 数组的创建方式:
    数组字面量 var arr = [];
    系统提供的数组的构造函数 var arr = new Array();

基本介绍

<script type = "text/javascript">
	//下面两语句等价:
	var arr = [1, 2, 3];
	var arr = new Array(1, 2, 3);
	
	//两种构造方式的仅有唯一区别:
	var arr = [10];//表示arr仅有一个元素
	var arr = new Array(10);//表示arr有10个元素(目前都为undefined)		
</script>

需要注意:在JS中,数组没有越界这一说,如果“越界”的引用了某一元素,则会显示undefined,而不是报错。“可以溢出读,也可以溢出写”:

<script type = "text/javascript">
	var arr = [1, 2, 3];
</script>

在这里插入图片描述
在这里插入图片描述

数组操作

数组是引用值,能够调用方法。对数组的操作的常用方法可以简单地分为以下两类:

  1. 操作后使原数组改变:
  • push:在数组最后添加若干指定元素,返回添加后数组长度
    在这里插入图片描述

push()方法的实现:

 Array.prototype.push = function() {
	for(var i = 0; i < arguments.length; i++) {
		this[this.length] = arguments[i];
	}
	return this.length;
}
  • pop:删除数组里最后一个元素,返回这一被删除的元素
  • shift:删除数组里最前面一个元素,返回这一被删除的元素
  • unshift:在数组最前面添加若干指定元素,返回添加后数组长度
    在这里插入图片描述
  • reverse:数组元素的顺序逆转了
  • sort:按ASCII码升序排序
    在这里插入图片描述

如果希望按照数字大小进行排序:sort()函数提供了编程接口,使得我们可以按照希望的形式进行排序。该编程接口具有两个规则,具体如下:

<script type = "text/javascript">
	var arr = [1, 2, 0, 9, 11, 22];
	arr.sort(function(a, b) { 
	//规则1:必须有两个形参,表示将要进行比较的数组中的两元素.
	//如第一轮a=1,b=2;第二轮a=1,b=0;第三轮a=0,b=9......
		if(a > b) {
			return 1;
		} else if(a < b) {
			return -1;
		} else {
			return 0;
		}	//规则2:返回值——
	}); 	//	返回值为正数时,表示a>b,a将置于b前
			//	返回值为负数时,表示a<b,b将置于a前
			//	返回值为0时,表示a=b,a、b位置不变

	//上面的一组代码等价于下面的形式:
	//arr.sort(test(a, b));
	//function test(a, b) {};
</script>

说明:上面程序sort()的编程接口类似于“冒泡排序法”。

  • 上面的升序接口可以进行如下的改进:
	arr.sort(function(a, b) { 
			return a - b;
	}); 
  • 若降序排列,则:
	arr.sort(function(a, b) { 
			return b - a;
	}); 
  • 给一个有序的数组,使其乱序:
	arr.sort(function(a, b) { 
			return Math.random() - 0.5;
	}); 

【说明:Math.random()函数返回(0, 1)之间的小数。Math.random() - 0.5则时正时负,不由两比较的元素决定,所以每两个数进行比较时,是否交换位置以及如何交换位置都是随机的,所以最终结果是乱序。注意,该函数被调用了很多次的!并不是一次就全部排好的。】

练习:按照字符串的字节长度将数组中的元素重新排列位置。

<script type = "text/javascript">
	var arr = ['es你','tggh','aryhobkv','a你','bb'];

	function retBytes(str) {
		var num = str.length;
		for(var i = 0; i < str.length; i++) {
			if (str.charCodeAt(i) > 255) {//汉字占两个字节,所以num在str.length的基础上加1操作
				num++;
			}
		}
		return num;
	}
	arr.sort(function(a, b) { // 始终要注意:a,b量参数表示数组中的元素
		return retBytes(a) - retBytes(b);	
	}); 		
</script>
  • splice:截除数组中的某段数据,返回被截除掉的元素(下面第一张图);该函数还可以在截除的同时,在截除的位置上添加若干元素(“若干”指:除了前两个参数,后面的参数都代表将要添加的元素)(下面第二张图)。利用该函数可以在指定位置添加元素(下面第三张图)。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  1. 操作后原数组不变:
  • concat:
    arr.concat(arr1):返回一个前半部分是arr,后半部分是arr1的新数组(arr、arr1都未改变)。
    在这里插入图片描述
  • join:join()函数的参数必须为字符串形式,表示按照指定字符将数组中的各元素连接起来。返回值为字符串类型。如果省略参数,则默认以“,”进行连接。
    在这里插入图片描述
    在这里插入图片描述
  • split:split()函数的参数必须为字符串形式,表示按照指定字符将字符串进行拆分。返回值为数组
    在这里插入图片描述
    在这里插入图片描述
  • toString:将数组变成字符串输出
    在这里插入图片描述
  • slice:
    • slice(a, b)表示从索引a处开始,截取到索引b处。
    • slice(a)表示从a处截取到最后。
    • slice()表示全部截取。
    • 返回截取到的部分,原数组不变。

类数组

类数组是一种特殊的对象,它具有以下特征属性名应该为数字(可以直接写成数字,也可以写成字符串类型的数字),用来表示相应的索引;必须有length属性;最好加上push属性,这样才能使用真正数组的push()方法,否则就不能对该类数组使用push()方法。【arguments就是一个类数组。】

通过一道题更好的认识其内部原理:

<script type = "text/javascript">
	var obj = {
		2 : 'b',//或者写成'2' : 'b',
		3 : 'c',
		length : 2,
		push : Array.prototype.push,
		splice : Array.prototype.splice
	}

	obj.push('d');
	obj.push('e');
</script>

问:程序执行完后,obj的内容是什么样的?


要想知道此问题,首先要知道push()函数的内部执行情况:

 Array.prototype.push() = function(target) {
  	obj[obj.length] = target;
  	obj.length ++;
 }

因此,对于obj.push('d');,将放在obj[2]处,即obj[2]处原来的b将变成d!然后length变成3,故对于obj.push('e');,将使obj[3]处原来的c将变成e


此外,可以看看如下输出:
在这里插入图片描述

类数组有很多应用,它本身是个对象,且同时具有了数组的一些特性,所以存储的内容更加强大,后面将经常使用到。

实例:数组去重

利用对象的特性:同一个属性名,不可能存在多次。下面unique()函数的原理就是:把要去重的数组的元素试图作为temp对象里的属性名放入temp里,然后随便对其赋上一个值(这里是“abc”);判断下一元素是否与前面某一元素重复时,只需判断是否存在以该元素为名称的属性?如何判断呢?那么我们就看其对应的值是undefined还是我们指定的那个值。如果是undefined,说明没有这样的属性名,也就没有对应的值,即undefined。代码如下(注意if语句):

<script type = "text/javascript">
	Array.prototype.unique = function() {
		var temp = {},
			arr = [],
			len = this.length;//将这种东西用变量保存下来,以免每次都要计算一下this.length!

		for(var j = 0; j < len; j++) {
			if(!temp[this[j]]) { //temp[this[j]]为undefined时
				temp[this[j]] = 'abc';
				arr.push(this[j]);
			}
		}
		return arr;
	}

	var target = [1,1,0,0,0,'a','a'];
	var arr = target.unique();
</script>

temp对象最终的样子:

	temp = {
		"1" : "abc",
		"0" : "abc",
		"a" : "abc"
	}

测试结果:
在这里插入图片描述

我的做法是(没用用到对象的特性…):

Array.prototype.unique = function() {
	var arr = [],
		len = this.length;//将this.length用变量保存下来,以免每次都要计算一下!
		
	for(var j = 0; j < len; j++) {
		if(arr.length == 0) {
			arr.push(this[j]);
		} else {
			for(var i = 0; i < arr.length; i++) {
				if (this[j] != arr[i] && i == arr.length - 1) {
					arr.push(this[j]);
				}
			}				
		}
	}
	return arr;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JavaScript 数组是用来存储一组有序的值。数组可以存储任何类型的数据,包括数字、字符串和对象。数组的元素可以通过索引来访问。JavaScript 提供了很多内置的方法来操作数组,如 push()、pop()、shift()、unshift()、slice()、splice()、sort()、concat()等。 ### 回答2: JavaScript是一种面向对象的编程语言,在Web开发领域中广泛使用。作为JavaScript中最核心的数据结构,数组是一个非常重要的概念。在本篇JavaScript学习手册中,我们将详细介绍JS数组。 什么是JS数组JavaScript数组是一组值的有序列表。这些值可以是任何类型,例如字符串、数字、布尔值甚至是其他的数组。数据项可以随时添加到数组中,也可以从数组中移除。数组的长度是可变的,它们可以根据需求扩展或缩小。 在JavaScript中,数组的下标始终从0开始,这是一个重要的概念。因此,在数组中,第一个元素的索引是0,第二个元素的索引是1,以此类推。 JS数组的创建 有许多方法可以创建JavaScript数组。最简单的方法之一是使用数组字面量: var myArray = [1, "string", true]; 上述代码创建了一个名为myArray数组,并将数字1、字符串“string”和布尔值true添加到该数组中。 另一种常见的创建数组的方式是使用Array()构造函数。例如,以下代码将演示如何创建一个长度为5的数组: var myArray = new Array(5); JS数组的方法 JavaScript提供了许多有用的方法,可以帮助我们操作数组。下面列出了一些最常用的方法: 1. push()方法 - 该方法在数组的末尾添加一个或多个元素。 2. pop()方法 - 该方法从数组的末尾删除一个元素。 3. shift()方法 - 该方法从数组的开头删除一个元素。 4. unshift()方法 - 该方法在数组的开头添加一个或多个元素。 5. concat()方法 - 该方法将两个或多个数组连接为一个数组。 6. slice()方法 - 该方法返回数组的一个子集。 7. splice()方法 - 该方法添加、删除或替换数组中的元素。 JS数组的循环 对于任何类型的数据结构,循环是一种非常常见和强大的操作。下面是一些常用的JS数组循环方法: 1. for循环 - 这是最常用的数组循环方法,在循环中使用数组的长度属性来遍历数组中的元素。 2. forEach()方法 - 该方法对数组中的每个元素执行一个函数。 3. map()方法 - 该方法返回一个新数组,其元素是通过对原始数组中的每个元素应用函数来获得的。 总结 JavaScript数组是开发Web应用程序时必须要掌握的一个重要的概念。它们是用来存储和管理数据的一种强大工具,并且JavaScript为操作数组提供了许多有用的方法和循环。在您学习JavaScript时,建议您花费足够的时间来熟悉JS数组及其相关的方法和循环。 ### 回答3: JavaScript数组是一种非常有用的数据类型,它可以存储多个值并按照特定的方式进行操作。在JavaScript中,数组可以包含任何类型的数据,包括字符串,数字,对象和函数。数组是一种非常强大的工具,可以帮助我们更有效地管理和操作数据。 JavaScript数组的基础知识包括数组的创建,访问和修改数组元素。我们可以使用数组字面量来创建一个数组,并可以使用索引号访问和修改数组中的元素。数组的索引是从零开始的,所以第一个元素的索引号为0,第二个为1,以此类推。 除了基本的数组操作之外,JavaScript数组还支持许多高级操作,例如排序,添加和删除元素,筛选和映射数组等。我们可以使用内置的数组方法和属性来执行这些操作。其中一些常用的方法包括push,pop,shift,unshift,slice,splice等。 当处理大量数据时,JavaScript数组的性能问题可能会成为一个问题。为了解决这个问题,我们可以使用更高效的数据结构,例如哈希表和二叉树。但在大多数情况下,JavaScript数组足以应对大多数应用程序的需求。 总之,JavaScript数组是一个非常有用的数据类型,它可以帮助我们有效地管理和操作数据。通过学习并掌握JavaScript数组的常用方法和属性,我们可以使我们的代码更加优雅和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值