js数组和类数组

数组的定义:

在[ ]里用逗号隔开,可以写入任意值,包括数组,字母,字符串,undefined等。
数组元素:数组中存取的数据;
数组长度:数组元素的个数
数组索引(下标):用来存储和访问数组中的数据;从第0位开始
1.通过字面量的方式创建数组:var arr = [ ];数组字面量,[ ]里的数据用逗号隔开(稀松数组),光写逗号会显示undefined。

var arr = [1,2,,,,3,4];
逗号之间没有数据就是undefined,相当于——[1,2,3,undefined,undefined,unfined,3,4]
数组长度arr.length——7

2.通过构造函数创建数组:var arr = new Array();

var arr = new Array(10);
只传一个参数就把这个参数当作长度而不是第一位值
数组的读和写:

①arr[num] //不可以溢出读,否则结果为undefined;
eg:var arr = [ ]; arr[10]访问第十一位值——undefined
②arr[num] = xxx; //可以溢出写
eg:` var arr = []; arr[10] = ‘abv’;给第十一位赋值,访问arr——[undefined*10,abv]

数组常用方法(数组的所有方法来源于Arr.prototype):

1.可改变原数组(可改变原数组的方法就七个)

①.push()在数组最后一位添加数据,可同时添加多位

系统是如何实现push: var arr = [1,2,3];
Arr.prototype.push = function (){
	for(var i = 0;i < arguments.length;i++){
		this[this.length] = arguments[i];
	}
	return this.length;
}

②.pop()把数组最后一位剪切出来,不用传参;

var arr = [1,2,3];
arr.pop();//剪切,并不是删除
访问arr——[1,2]
var num = arr.pop();//将剪切出来的存放在num中
num——3//访问num

③.unshift()在数组前面增加数据
var arr = [1,2,3];arr.unshift(0,1);查看arr——[0,1,1,2,3]
④.shift() 在数组前面删除并返回一个元素,也是剪切
var arr = [1,2,3]; arr.shift()——>[2,3];
⑤.reverse()把原数组反过来
var arr = [1,2,3]; arr.reverse()——>[3,2,1]
⑥.splice() 切片方法;arr.splice(从第几位开始(如果从负数位开始就是倒数的第几位),截取多少的长度,在切口处添加新的数据)
数组在内部如何实现顺序归正(-1是倒数第一位,+1是第二位
pos += pos > 0 ? 0 : this.length

var arr = [1,2,3,4,5];
arr.splice(1,2)//截掉[2,3]
返回截掉后的值[1,4,5]

var arr = [1,2,3,5];
arr.splice(3,0,4)//如果不截取,那么从第几位开始就从第几位增加数据
[1,2,3,4,5]

⑦.sort() 给数组进行升序排序(可以自己改规则),

var arr = [5,4,3,2,1];
arr.sort();
console.log(arr);——[1,2,3,4,5]

var arr = [1,3,5,4,10];
arr.sort()理想是[1,3,4,5,10]
结果是[1,10,3,4,5],是按ascII码排序的

可以自己改规则:var arr = [2,10,20,13,4,8,9];//挨个比较
升序规则:1.必须写两个值
2.看返回值return:
①返回值是负数前面数放前面
②为负数,后面的数放前面
③为0不动

arr.sort(function(a,b){
	if(a > b){
		return 1;//正数
	}else{
		return -1;//负数
	}
})
简化后:arr.sort(function(a,b){
	return a - b;//升序:a-b是正数a > b,a-b是负数a
2.不改变原数组

①.concat() 连接两个数组,并返回结果不改变原数组

var arr = [1,2,3];
var arr1 = [4,5];
arr.concat(arr1);——[1,2,3,4,5]

②.toString() 把数组变成字符串并返回结果
var arr = [1,2,3]; arr.toString()——123
③.splice()方法 .splice(从该位开始截取,截取到该位)两个参数;一个参数时(从第几位开始一直截取到最后);没参数(整个截掉)

var arr = [1,2,3,4];
var newArr = arr.splice()//用个变量接收——[ ]

④.join() 传什么参数就用参数把数组里的数据连接起来,要传字符串形式的
var arr = [1,2,3,4,5]; arr.join("-")——"1-2-3-4-5“
⑤.split() 按照什么拆分
var arr = [1,2,3,4,5,6]; arr.split("4")——[“1-2-3-”,“5-6”]
④和⑤可逆

类数组

arguments是类数组
1.可以利用属性名模拟数组的特性
2.可以动态的增长length属性
3.如果强行让类数组调用push方法,则会根据length属性值的位置进行属性的扩充

★类数组的组成部分:属性要为索引属性,必须有length属性,最好加push
好处:把数组和对象的特性拼接在一起,但不是所有都是
var obj = {
	"0" : 'a',
	"1" : 'b',
	"2" : 'c',
	"length" : 3,
	"push" : Array.prototype.push,
	"splice" :Array.prototype.splice
}
查看obj——["a","b","c"]
数组去重
var arr = [1,1,1,2,2,2,3,3,3];
Array.prototype.unique = function(){//原型链上编程unique
	var temp = {},//定义空对象
		  arr = [],//定义空数组
		  len = this.length;
	for(var i = 0; i < len;i++){//把每个值取出
		if(!temp[this[i]]){//取出的值作为属性名,里面没值才执行
			temp[this[i]] = 'abc';//利用对象特性同一属性名不能出行两次;值为了占位置,主要取属性名
			arr.push(this[i]);//属性名放在新数组里
		}
	}
	return arr;//取出属性名
}
冒泡排序
将下面数字从小到大排序
var arr = [5,4,3,2,1];
for(var i = 0;i < arr.length - 1;i++){//循环控制比较的论数
	for(var j = 0;j < arr.length -1 - i;j++){
		if(arr[j] > arr[j + 1]){
			var temp = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = temp;
		}
	}
}
console.log(arr);——[1,2,3,4,5]

例题:阿里巴巴题

var obj = {
	"2" : "a",
	"3" : "b",
	"length" : 2,
	"push" : Array.prototype.push
}
obj.push("c");
obj.push("d");
访问obj——["2": "c", "3" : "d",length : 4]
类数组如何实现
Array.prototype.push = function(target){假设传一位参数
	//this[obj.length] = taget;
	obj[obj.length] = target;
	//this.length++;
	obj.length++;
}

案例:封装一个typeof方法,精确识别原始值和引用值

function typeof(target){
	var ret = typeof(target);
	var template = {
		"[object Array]" : "array",
		"[object Object]" : "object",
		"[object Number]" : "number - Object",
		"[object Boolean]" : "boolean - Object",
	    "[object String]" : "string - Object"
	}
	if(target === null){
		return "null";
	}else if(ret === "object"){//引用值
		var str = Object.prototype.toString.call(target);
		return template[str];
	}else{
		return ret;//原始值
	}
}

数组案例:反转数组

var arr = [1,2,3,4,5,6];
for(var i = 0;i <= arr.length/2; i++){//循环目的控制交换次数,循环次数是数组长度的一半
	var temp = arr[i];//把第一个元素放在第三方变量中
	arr[i] = arr[arr.length - 1 - i];
	arr[arr.length - 1 - i] = temp;
}
console.log(arr);

数组案例:把数组中每个元素用|连接起来组成一个字符串输出

var names = ["apple","banana","origin","pron"];
var str = " ";
for(var i = 1;i < names.length;i++){
	str += "|" + names[i];
}
console.log(names[0] + str);//把第一个元素加上

去掉数组中重复的0,把其他数据放在新的数组中

var arr = [1,2,0,3,0,4,5,0,0,6];
var newArray = [];//新数组用来存放非0数
for(var i = 0; i < arr.length;i++ ){
	if(arr[i] != 0){
		newArray[newArray.length] = arr[i];//把新数组的长度作为下标使用,数组的长度是可以改变的
	}
}
console.log(newArray);

数组案例:提示用户输入班级人数,求总成绩,平均值,最大值,最小值

var perCount = parseInt(prompt("请输入班级人数"));//提示用户输入人数并转成数字类型
var scores = [];//存储班级每个人的成绩
for(var i = 0;i < perCount;i ++){//提示用户输入成绩
	//把每个人的成绩存储到数组中
	scores[scores.length] = parseInt(prompt("请输入第 + (i + 1) + 个人的成绩:"));
}
//求总成绩,平均值,最大值,最小值
var sum = 0;//总成绩
var avg = 0;//平均值
var max = scores[0];//最大值
var min = scores[0];//最小值
for(var i = 0;i <= scores.length;i++ ){
	sum += scores[i];
	if(max < scores[i]){
		max = scores[i];
	}
	if(min > scores){
		min = sores[i];
	}
}
avg = sum / scores.length;
console.log("总成绩:" + sum);
console.log("平均值" + avg);
console.log("最大值" + max);
console.log("最小值" + min);

你可能感兴趣的:(JavaScript,js数组,类数组,数组去重,冒泡排序)