数组去重练习
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var arr=[1,2,5,1,5,2,25,2,2,2,2,2,6,7,4,2,4,34,2];
/*
题目:去重一个数组中重复的数字
*/
//遍历出数组所有的数
for (let i = 0; i < arr.length; i++) {
// 遍历出从第一个数开始后面的数
for (let j = i+1; j <arr.length; j++) {
// 判断,当i(当前数),等于j(当前数后的数)时,删除j
if (arr[i]==arr[j]) {
// 使用splice方法删除对应索引位置的数字
arr.splice(j,1);
// 当删除后继续判断当前数字是否重复,使j--,再次循环判断
--j;
}
}
}
// 输出数组
console.log(arr);
</script>
</head>
<body>
</body>
</html>
数组的剩余方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
//创建一个数组
var arr1=["往往","掉今晚","单位"];
//创建一个数组
var arr2=["答复","发生的","大武当"];
/*
concat()可以连接两个或多个数组,并将新的数组返回
---该方法不会对原数组产生影响
---该方法也可以在()传递元素到新的数组末尾
*/
var result=arr1.concat(arr2); //['往往', '掉今晚', '单位', '答复', '发生的', '大武当']
var result=arr1.concat(arr2,"插入的","元素"); //['往往', '掉今晚', '单位', '答复', '发生的', '大武当', '插入的', '元素']
console.log(result);
/*
join()
---该方法可以将数组转换为一个字符串
---该方法不会对原数组产生影响,而是会将转换后的字符串作为结果返回
---在join()中可以指定一个字符串作为参数,这个字符串将会成为数组中元素的连接符
*/
var result=arr1.join(); //往往,掉今晚,单位
var result=arr1.join("1"); //往往1掉今晚1单位
var result=arr1.join("-"); //往往-掉今晚-单位
console.log(result);
console.log(typeof result); //string
/*
reverse()
---该方法用来反转数组(前边的去后边,后边的去前边)
---该方法会直接修改原数组
*/
var result=arr1.reverse(); //['单位', '掉今晚', '往往']
console.log(result);
/*
sort()
---可以用来对数组中的元素进行排序
---也会影响原数组,默认会按照Unicode编码排序
*/
arr1= ["a","r","c","g","e","h"];
result = arr1.sort(); //['a', 'c', 'e', 'g', 'h', 'r']
console.log(result);
/*
即使对于纯数字的数组,使用sort()排序时,也会按照Unicode编码进行排序,
所以对数字进行排序时,可能会得到错误的结果
arr1=[1,2,4,33,3,21,3,12,32,4];
result = arr1.sort(); //[1, 12, 2, 21, 3, 3, 32, 33, 4, 4]
console.log(result);
我们可以自己来指定排序的规则
我们可以在sort()添加一个回调函数,来指定排序的规则,
回调函数中需要定义两个形参,
浏览器将会分别使用数组中的元素作为实参去调用回调函数
使用哪个元素调用不稳定,但是肯定的是,在数组中,a一定在b前边
---浏览器会根据回调函数的返回值来决定元素的顺序,
如果返回一个大于0的值,则元素会交换位置
如果返回一个小于0的值,则元素位置不变
如果返回一个0,则认为两个元素相等,也不交换位置
---如果需要升序排列,则返回a-b,
如果需要降序排列,则返回b-a
*/
arr1=[1,2,4,33,3,21,3,12,32,4];
result = arr1.sort(function(a,b) {
// //1, 如果前边的数大
// if (a<b) {
// return -1;
// }else if(a=b){
// return 0;
// }else{
// return 1;
// } //[1, 2, 3, 3, 4, 4, 12, 21, 32, 33]
// 2,如果a-b大于0,返回正值,交换,否则不交换
return a-b;
}); //[1, 2, 3, 3, 4, 4, 12, 21, 32, 33]
console.log(result);
</script>
</head>
<body>
</body>
</html>
1.垃圾回收
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
/*
垃圾回收(GC)
---就像人生活的时间长了会产生垃圾一样,程序运行过程中也会产生垃圾,这些垃圾积攒过多以后,会导致程序的运行速度过慢,所以我们需要一个垃圾回收机制,来处理程序运行过程中产生的垃圾
---当一个对象没有任何的变量或属性对它进行引用,此时我们将永远无法操作该对象
此时这种对象就是一个垃圾,这种对象过多会占用大量的内存空间,导致程序运行变慢,所以这种垃圾必须进行清理。
---在js中拥有自动的垃圾回收机制,会自动将这些垃圾对象从内存中销毁,
我们不需要也不能进行垃圾回收的操作
---我们需要做的只是要将不再使用的对象设置为null即可
*/
var a=new Object();
// 设置a变量不再指向对应对象的内存地址,可以让原来的a对象指向的那个内存地址的对象变为垃圾,
a=null;
console.log(a); //null
</script>
</head>
<body>
</body>
</html>
2.js中的数组
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
/*
内建对象
宿主对象
自定义对象
数组(Array)
---数组也是一个对象
---它和我们普通对象一样,也是用来存储一些值的
---不同的是普通对象是使用字符串作为属性名的,
而数组是使用数字来作为索引操作元素
---索引,
从0开始的整数就是索引
---数组的存储性能比普通对象要好,在开发中我们经常使用数组来存储一些数据
*/
// 创建数组对象
var arr=new Array();
// 使用typeof检查一个数组时,会返回Object
console.log(typeof arr);
/* 向数组中添加元素
语法:数组[索引] = 值
*/
arr[0]=10;
arr[1]=11;
/* 向数组中读取元素
语法:数组[索引]
*/
console.log(arr[0]); //10
console.log(arr[1]); //11
console.log(arr[5]); //undefined
/* 获取数组的长度
可以使用length属性来获取数组的长度(元素的个数)
语法: 数组.length
*/
console.log(arr.length); //2 因为索引从0开始
/* 对于连续的数组,使用length可以获取到数组的长度(元素的个数)
对应非连续的数组,使用length会获取到数组的最大的索引+1,
且输出时显示一堆空属性
尽量不要创建非连续的数组 */
// 非连续的数组
var arr2=new Array();
arr2[0]=10;
arr2[10]=20;
console.log(arr2); //(11) [10, 空属性 × 9, 20]
/*
修改length
如果修改的length大于原长度,则多出来的部分会空出来
如果修改的length小于原长度,则多出来的元素会被删除
*/
//修改的length大于原长度
arr2.length=20;
console.log(arr2.length); //20
console.log(arr2); //(20) [10, 空属性 × 9, 20, 空属性 × 9]
// 修改的length小于原长度
var arr3=new Array();
arr3[0]=10;
arr3[1]=5;
arr3[2]=20;
arr3.length=2; //会删除索引为2的元素
console.log(arr3); //[10, 5]
/*
向数组的最后一个位置添加元素
语法:数组[数组.length] = 值;
*/
arr3[arr3.length]=30;
arr3[arr3.length]=40;
console.log(arr3); //[10, 5, 30]
</script>
</head>
<body>
</body>
</html>
3.数组字面量
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
//创建一个数组
var arr=new Array();
/* 使用字面量创建一个数组
语法: []
*/
var arr2=[];
console.log(typeof arr2); //object
//使用字面量创建的数组,可以在创建时指定数组中的元素
var arr3= [1,2,3,4,5];
console.log(arr3); //[1, 2, 3, 4, 5]
console.log(arr3.length); //5
// 使用构造函数创建函数时,也可以同时添加元素,将要添加的元素作为构造函数的参数传递
//元素之间使用,隔开
var arr4=new Array(1,2,3,4);
console.log(arr4); //[1, 2, 3, 4]
//创建一个元素为10的数组
var arr5=[10];
console.log(arr5); //[10]
//创建一个数组长度为10的数组
var arr6=new Array(10);
console.log(arr6); //[空属性 × 10]
//数组中的元素可以是任意的数据类型
arr6=["hello",1,true,undefined,null];
console.log(arr6[0]); //hello
console.log(arr6[3]); //undefined
// 也可以是对象(函数是特殊的对象)
var Obj={
name:"孙悟空",
age:19
};
arr6[arr6.length]=Obj;
console.log(arr6[arr6.length-1]); //{name: '孙悟空', age: 19}
//也可以是一个函数
arr6[arr6.length]=function(){alert("这是一个数组中的函数");};
console.log(arr6[arr6.length-1]); //ƒ (){alert("这是一个数组中的函数");}
// 调用数组里面的函数
arr6[arr6.length-1](); //输出"这是一个数组中的函数"
// 也可以是一个数组,如下这种数组我们叫做二维数组
arr6=[[1,2,3],[3,4,5]];
// 取出二维数组中索引为0的一维数组
console.log(arr6[0]); //[1, 2, 3]
</script>
</head>
<body>
</body>
</html>