在[ ]里用逗号隔开,可以写入任意值,包括数组,字母,字符串,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]
①.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
①.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属性值的位置进行属性的扩充
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);