数组去重
[1,2,3,4,1,2,3,5,6,7]
<script>
var arr = [1, 2, 1];
var newArr = [];
for (var i = 0; i < arr.length; i++) {
var flag = true;//默认的时候往里面放。
for (var j = 0; j < newArr.length; j++) {
if (newArr[j] == arr[i]) {
flag = false;
break;
}
}
if (flag) {
newArr[newArr.length] = arr[i];
}
}
console.log(newArr);
</script>
冒泡排序
[5,2,1,4]//开始进行比较第一个和第二比较,第二个和第三个比较....//如果比较的两个数大的放后面。
1-----------------------
5和2 交换 2 5 1 4
5和1 交换 2 1 5 4
5和4 交换 2 1 4 5
第一圈比较总共比较了3次,最后一个数是最大的。
2------------------------
2和1 交换 1 2 4 5
2和4 不交换 1 2 4 5
第三个数不用和第四个数比较,因为第四个数是最大的。
第二圈总共比较2次,最后一个最大,倒数第二个第二大。
3------------------------
1和2 不交换 1 2 4 5
第二个不用和第三个比较,因为第三个肯定比第二个大。
第三圈完成共计1次。
-
就是知道了要比较的下标怎么获得
var arr = [5,2,1,4]; //得知道每次比较的值的下标 //4个数比较了3次,每次的下标我也知道了。 /* i=0 0<3 true 0 1 i=1 1<3 true 1 2 i=2 2<3 true 2 3 i=3 3<3 false */ for (var i = 0; i < arr.length -1 ;i++){ console.log(i,i+1); }
-
根据获得到的下标,然后开始比较、换值。
//4个数进行了3轮比较,得到了1个最大的数 var arr = [5,2,1,4]; /* i=0 0<3 true 5>2 true tmp=5; arr[0]=arr[1]//arr[0]=2 arr[1]=5//[2,5,1,4] i=1 1<3 true arr[1]>arr[2]//5>1 true tmp=5; arr[1] = 1 arr[2] = 5;//[2,1,5,4] i=2 2<3 true arr[2]>arr[3]//5>4//true tmp=5; arr[2] = 4 arr[3] = 5;//[2,1,4,5] i=3 3<3 false */ for (var i = 0 ; i < arr.length -1 ; i++){ if (arr[i] > arr[i+1]){ //交换位置 var tmp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = tmp } }
-
就得每次都比较
var arr = [5,2,1,4]; //第一次比较获得了最大的数 for (var i = 0 ; i < arr.length -1 ; i++){//[2,1,4,5] if (arr[i] > arr[i+1]){ //交换位置 var tmp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = tmp } } //[2,1,4,5]进行比较 //第二次比较 /* i=0; 0<2 true arr[0]>arr[1]//2>1 true tmp = 2 arr[0] = 1 arr[1] = 2;//[1,2,4,5] i=1; 1<2 true arr[1]>arr[2]//2>4 false i=2; 2<2 false */ for (var i = 0; i < arr.length - 1 - 1;i++){ if (arr[i] > arr[i+1]){ //交换位置 var tmp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = tmp } } //第三次比较 [1,2,4,5] /* i=0 0<1 true arr[0]>arr[1]//1 > 2 false i=1 1<1 false */ for (var i = 0; i < arr.length - 1 - 1-1;i++){ if (arr[i] > arr[i+1]){//[1,2,4,5] //交换位置 var tmp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = tmp } }
函数
什么是函数
函数:是完成任务并且已经命名的代码块,可以用来反复使用。
函数本质上也是一种数据,也是属于对象类型。
函数也是值,函数中包含的是可执行的代码。
函数的作用
- 解决代码冗余问题,形成代码复用。
- 封装代码,让函数内部的代码对外部不可见。
- 将整个代码、项目,通过函数模块化。
函数的种类
- 系统函数,系统已经提供的一些函数,有很多。我们也学了很多
parseInt()
、Number()
、String()
。 - 自定义函数,如果系统中的函数不能满足我的需求,那我就自己写一个。
如果系统函数能够实现功能一定要用系统函数,不要自己写。
函数的定义和调用
步骤:
- 将你要实现代码写出来。
- 将这些代码用大括号包起来。
- 使用关键字
function 函数名()
来声明函数。 - 将里面经常变的量提取出来作为参数。
__函数不调用不执行。__调用函数使用函数名()
。
function 函数名(){
}
注意:
- 函数名的定义要有意义。
- 函数名的定义规则和变量的定义规则相同。
- 函数声明有三种方式,这种方式声明的函数的名字可以重复(自定义函数、系统函数都可以)一旦发生重复后面的覆盖前面的。
- 函数有三种方式定义,这种函数的声明方式,在调用时,调用的代码可以放在函数定义之前也可以放在函数定义之后。
其他的声明方式
-
函数表达式声明
格式:
变量名 = function(){ 函数体 };
-
使用函数表达式声明的方式声明函数,函数末尾要有一个分号。
-
这种方式是函数表达式声明,即外围的语句是表达式。
函数表达式:它是表达式,不能以大括号开头,不能以function开头。
-
function后面可以有名字也可以没有名字。
-
这种方式创建的函数调用必须在创建之后。
-
-
函数构造器声明
var sayLiPeiHua = new Function("console.log('xxx真英俊?');"); sayLiPeiHua(); new Function('参数1','参数2'.......'语句')
new Function()
不这样用是因为该方法会导致代码解释两次(一次是解释常规的ES代码,第二次要将传入的字符串解析为可以执行的代码)
函数定义的前两种方式区别:
如果用第一种方法去定义的函数,会被提前加载,因此调用语句可以写在函数的定义之前,因为那个时候函数已经被加载完毕了。而用第二种方式定义的函数,是不会被提前加载的。换句话说,必须要执行到函数定义的语句时,才会加载这个函数。因为在调用第二种函数的时候,该函数还没有加载啊,那么强行调用一个不存在的函数,自然是不被允许的咯!
函数的其他注意点
函数是数据,函数是对象。
函数名只不过是这个数据的标识。
-
当你要访问这个函数的数据而不是执行这个函数的话,必须去掉后面的那对圆括号。
-
函数是一个数据,函数名是标识,一个函数可以有多个标识。
function say(){ console.log('xx被我打了'); } /* console.log(say); console.dir(say); */ var test = say; var test1 = say; test(); test1();
函数的参数
自定义函数的设计原则:用户可以参与控制自定义函数,可以对自定义函数进行微调。
<script>
function printTable(row,col) {
/* var row = 10;
var col = 10; */
document.write('<table border="1" width="500">');
for (var i = 0; i < row; i++) {
document.write('<tr>');
for (var j = 1; j <= col; j++) {
document.write('<td> </td>');
}
document.write('</tr>');
}
document.write('</table>');
}
printTable(10,10);
printTable(5,5);
printTable(100,10);
</script>
- 形参:形式上的参数,声明函数的时候,提供的参数。
- 实参:调用的时候在
()
里面实际使用的参数。
注意:
- 形参和实参传值是一一对应的。
- 多个形参和实参之间使用逗号进行分隔。
- 函数的形参只不过相当于在函数内部定义了一个变量。
- 函数也是数据,也是对象。其中就有属性和方法。其中有一个length属性用来表示有多少个形参。
- ES中的函数的形参、实参个数可以不相等。
- 如果实参比形参少,那么多出来的形参将会自动被赋予
undefined
,并且假如进行加减运算的话就是:1+undefined+undefined = NaN。 - 如果实参比形参多,多出来的参数将可以使用
arguments对象
来获得。
- 如果实参比形参少,那么多出来的形参将会自动被赋予
arguments对象
-
arguments对象
只在函数内部才有。因为它是实参对象。 -
arguments对象
它是一个类数组对象(array-like),因为它和数组相似的地方就是因为其中包含了索引和length属性,来访问这个类数组。这样你就可以获得传递进来的每一个实参。function a(){ console.log(arguments); console.log(arguments.length); console.log(arguments[0]); console.log(arguments[1]); console.log(arguments[2]); console.log(arguments[3]); } a('a','b','c','d');
-
arguments对象适合在不确定传递多少实参的时候使用。
// 需求:接收两个或两个以上的数进行相加得到和 function sum(arg1, arg2) { //console.log(arg1 + arg2); var total = 0; for (var i = 0; i < arguments.length; i++) { total += arguments[i]; } console.log(total); } sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
-
函数的形参我可以不写,都可以使用arguments对象来获得,但是使用形参会比较方便。
函数的返回值
return
语句,格式:return [值]
,可以将return理解为整个函数最后计算的结果是什么。(返回的值是什么都无所谓,你看你想让它返回什么)。
return返回的值将会返回到函数调用处。
为什么要用return就是为了以后进行二次处理。
什么时候用return 什么时候不用return,完全看你的需求。
注意:
-
刚开始写的时候我们并没有说返回的值的事,没有return的时候函数的返回值是undefined。
<script> function sum(arg1, arg2) { var res = arg1 + arg2; } var r = sum(1,2); console.log(r); </script>
-
函数会在执行完return语句之后立即退出。return之后的语句不会执行。
-
return语句后面可以不带任何返回值,函数在执行之后将会返回undefined。
function sum(arg1, arg2) { var res = arg1 + arg2; return; } console.log(sum(1,2));
return的作用:
- 返回函数中要返回的值。
- 终止函数的执行。(如果return后面没有内容,只是单纯的终止函数的执行)
什么时候用return完全看你的需求。 它的作用返回函数的执行结果,终止函数的执行。
一个完整的函数有三大件:
- 函数体(功能)
- 参数
- 返回值
返回值:
- 没有参数、没有返回值
- 有参数没有返回
- 没有参数有返回值
- 有参数有返回值(用的最多)
步骤:
- 将你要实现代码写出来。
- 将这些代码用大括号包起来。
- 使用关键字
function 函数名()
来声明函数。 - 将里面经常变的量提取出来作为参数。