一、事件处理函数的问题
// 代码并不永远是从上而下执行的
console.log(111); // 111
// 事件处理函数是后面才执行,也就是点击的时候才会执行
document.onclick = function (){
console.log(666);
}
console.log(222); // 222
function fn(){
fn2()
function fn2(){
return 2
}
return 3
}
var res = fn();
console.log(res); // 3
二、知识点回顾
// 函数:
// 形参和实参,不对等的
// 短路赋值
// 字符串拼接(返回很多个值的时候,)
// 作用域!!!
// 全局,局部,作用域是相对的(子函数可以访问到父函数的变量 )
// 形参:本质就是一个局部变量
// 预编译
// 提升var和具名函数
// 函数:一种数据类型
// 系统函数 prompt() confirm() eval()
// 递归:传递与回归,自己调用自己
三、欧几里得求最大公约数
// 欧几里得求最大公约数
// 8 12
// 8 / 12 8
// 12 / 8 4
// 8 / 4 0
// 4 / 0
// 3 7
// 3 / 7 3
// 7 / 3 1
// 3 / 1 0
// 1 / 0
// a % b === 0 b就是最大公约数
function gcd(a , b){
// if(a % b === 0){
// return b
// }
// return gcd(b , a % b)
return a % b === 0 ? b : gcd(b , a % b);
}
// b为0的时候,a就是他们的最大公约数
// function gcd(a , b){
// return b === 0 ? a : gcd(b , a % b);
//}
var res = gcd(28,18)
console.log(res);
四、作业-随机产生0-100的数,多少次能抓到0
//随机产生0-100之间的数,多少次才会抓到0 -- 递归?
// for 循环求解
// var count = 0 ;
// for(var i = 0 ; ; i++){
// var a = parseInt(Math.random() * 100);
// count++ ;
// if(a === 0){
// break;
// }
// }
// console.log(count);
//递归求解
var count = 0;
function randZero(){
var a = parseInt(Math.random()*100);
count++;
if(a == 0){
return count
}
return randZero()
}
console.log(randZero());
五、arguments
// console.log(1); // 1
// console.log(1,2); // 1 2
// console.log(1,2,3); // 1 2 3
// function sum(a,b){
// return a + b
// }
// console.log(sum(1,2,3,4)); // 打印结果为3 后两个参数不接收
// 一般情况下,使用形参来接受实参的值
// 话可以使用arguments来接受实参
function log(){
// 伪数组 / 类数组
console.log(arguments); // [1,2]
console.log(arguments[0]); // 1
console.log(arguments[1]); // 2
console.log(arguments[2]); // undefined
console.log(arguments.length); // 2
}
log(1,2)
六、数组
// var a = 1 ;
// var b = 3 ;
// var c = 4 ;
// var d = 5 ;
// 数组:存储一组相同数据类型的数据
var arr = [1,3,5,,2] ;
console.log(arr); // 打印 [1,3,5,2] 打不出空值
// 数组下标 访问数组的值的方法:arr[index]
console.log(arr[0]);// 1
// 数组的长度
console.log(arr.length); // 5
console.log(arr[3]); // undefined 因为是空值
var arr = ['a' , 'b' , 'c'];
var arr = [1,2,'a','b',true]; // 不太规范
七、数组的长度
var arr = [1,2,3] ;
console.log(arr[10]); // undefined
// [1,2,3,,,,,,,20]
// 实际上变相的加长了数组的长度
arr[10] = 20 ;
console.log(arr[10]); // 20
console.log(arr.length); // 11
console.log(arr); // [1,2,3, , , , , , , ,20]
八、数组的声明
// var arr = [1,2,3] // 字面量声明
// 数组是一个对象
// var arr = new Array(1,2,3); // 实例化一个对象Array构造函数(用于创建对象的)
// console.log(arr.length); // 3
// console.log(arr); // [1,2,3]
// var a = 1 ; // 字面量声明
// var b = new Number(2) ; //实例化一个对象
// console.log(a); // 1
// console.log(b); // Number
// var c = 'hello' ;
// var d = new String('hello');
// console.log(c); // hello
// console.log(d); // String
// 当Array只有一个参数的时候,表示数组的长度
// var arr2 = new Array(10);
// console.log(arr2); // length:10
// 声明一个空数组,向数组中追加值
var arr = [];
arr[0] = 'a' ;
arr[1] = 'b' ;
arr[2] = 'c' ;
arr[10] = 'f'
console.log(arr); // length:11
十、生成十个随机数
// 生成10个数,存入数组
// 生一个,存一个
// 创建一个空数组
var arr = [];
for(var i = 0 ; i < 10 ; i++){
// arr[i] = rand(0,100);
arr[arr.length] = rand(0,100);
}
console.log(arr);
十一、数组的遍历
// 遍历:读取数组中的每一个值
var arr = [1,2,3,4,,,,5] ;
console.log(arr[0]); // 1
console.log(arr[1]); // 2
console.log(arr[2]); // 3
// 循环遍历
// for(var i = 0 ; i < arr.length ; i++){
// console.log(arr[i]);
// }
//长度为6 , 索引为5
// for in 用于遍历对角的角标 -- bug(自动过滤掉空值)
// for(var i in arr){
// console.log(arr[i]);
// }
// for of 遍历对象 的值
// for(var v of arr){
// console.log(v);
// }
十二、存入10个数,取平均数
// var arr = [];
// 抓10个数字,放进数组
// var n1 = rand(0,100);
// arr[0] = n1 ;
// var n1 = rand(0,100);
// arr[1] = n2 ;
// var n3 = rand(0,100);
// arr[2] = n3 ;
// var n4 = rand(0,100);
// arr[3] = n4 ;
// for(var i = 0 ; i < 10 ; i++){
// // arr[arr.length] = rand(0,100)
// arr[i] = rand(0,100)
// }
// console.log(arr);
// 1-100存入数组
// var arr = [1,2,3,4,5,6,7....100]
var arr = [];
// arr[0] = 1 ;
// arr[1] = 2 ;
// ...
for(var i = 0 ; i < 100 ; i++){
arr[i] = i + 1 ;
}
console.log(arr);
// 把数组中所有数求和
var sum = 0 ;
// 遍历数组
for(var i in arr){
sum += arr[i]
}
var res = sum / arr.length;
console.log(res);
十三、数组随机取值
// 封装函数:求数组中的平均数
// 参数,返回值
function averageArr(arr){
//数组中的所有数求和
var sum = 0 ;
//遍历数组
for(var v of arr){
sum += v
}
//求平均数
return sum / arr.length
}
var arr = [];
for(var i = 0 ; i < 10 ; i++){
// var n = rand(0,100);
// arr[i] = n ;
// 每次赋值之后,数组的长度都会发生改变
arr[arr.length] = rand(0,100);
}
console.log(arr);
var res = averageArr(arr)
console.log(res);
十四、随机验证码
function rand(min,max){
return parseInt(Math.random()*(max-min)+min)
}
var arr = ['a','b','c','d','1','2','3','4','A','B','C','D'];
var res = '';
for(var i = 0 ; i < 4; i++){
// var j = rand(0,arr.length);
// var v = arry[j] ;
// res += v ;
res += arr[rand(0,arr.length)];
}
console.log(res);
十五、找到数组中的最大值
// // 找到数组中的最大值
// 一一比较
// 假设第一个值最大
// 9 8 6 3 1
// 假设第一个值最大 max = 9 ;
// 9 8 比较 9
// var arr = [6,3,2,12,34,56,5];
// // 假设第一个值最大
// // 然后两两比较 把较大的值赋给max
// var max = arr[0] ;
// 拿他和后面的所有数比较
// for(var i = 1 ; i < arr.length ; i++){
// // 如果这个数比后面的数要小
// if(max < arr[i]){
// // max 只存储最大的那个数
// max = arr[i]
// }
// }
// console.log(max);
function maxArr(arr){
// 找到最大值
// var arr = [6,3,2,12,34,56,5];
// 假设第一个值最大
// 然后两两比较 把较大的值赋给max
var max = arr[0] ;
for(var i = 1 ; i < arr.length ; i++){
//如果这个数比后面的数要小
if(max < arr[i]){
// max 只存储最大的那个数
max = arr[i]
}
}
console.log(max);
return max
}
maxArr([1,4,5,632,234,23,4])
//找到最小值
// var min = arr[0];
// for(var i = 1 ; i < arr.length ; i++){
// if(min > arr[i]){
// min = arr[i] //把较小的值赋给min
// }
// }
// console.log(min);
// 找到数组中是否存在某个值 [1,2,3,4,56] 3
// 把数组中的值拼接成字符串 [1,2,3,4] '1,2,3,4'
十六、找到数组中是否存在某个值
// 找到数组中是否存在某个值
// 把要找的这个值与数组中的每一个值作比较
// var arr = [1,2,3,4,5] ;
// // // 因为找到他存在的证据很容易
// var flag = false ;
// // // 遍历数组
// for(var v of arr){
// if(55 === v ) {
// // alert('存在')
// flag = true ;
// }
// }
// // //比较结束以后,才能说找不到
// alert(flag)
function includes(arr,n){
// // // 因为找到他存在的证据很容易
// var flag = false ;
//遍历数组
for(var v of arr){
if(n === v ) {
// alert('存在')
// flag = true ;
// 如果已经找到了就需要继续找
// break;
return true
}
}
// 比较结束以后,才能说找不到
// return flag
return false
}
var res = includes([1,2,3,4],12)
console.log(res);
十七、数组拼接成字符串
// 把数组中的值拼接成字符串 [1,2,3,4] -> 1,2,3,4
// 思路:把数组中的每一个值拼接到字符串中
var arr = [1,2,3,4];
var res = '' ;
// for (var i in arr){
// // 最后一个不加逗号
// console.log(i); // for in 一般用于遍历对象,字符串
// if( i == arr.length - 1){
// res += arr[i]
// }else{
// res += arr[i] + ','
// }
// }
// console.log(res);
// 一般,数组的遍历直接使用for循环
// for(var i = 0 ; i < arr.length ; i++){
// // 最后一个不加逗号
// console.log(i); //字符串
// res += i < arr.length-1 ? arr[i] + ',': arr [i]
// }
// console.log(res);
function join(arr,f){
for(var i = 0 ; i < arr.length ;i++){
// 最后一个不加逗号
// console.log(i) ; //字符串
res += i < arr.length-1 ? arr[i] + f : arr [i]
}
console.log(res);
return res
}
join([1,2,3,4] , '#')
十八、冒泡排序
// 数组中的值从小到大排序
var arr = [8,5,3,2,1];
// 思路
// 第一轮 拿到最大值放在最后面
// 8 5 5 8 3 2 1
// 8 3 5 3 8 2 1
// 8 2 5 3 2 8 1
// 8 1 5 3 2 1 8
// 第二轮 拿到第二大的值放在倒数第二个
// 5 3 3 5 2 1 8
// 5 2 3 2 8 2 1
// 5 1 3 2 1 5 8
// 5 8 3 2 1 5 8 多余的一次
// 第三轮
// 3 2 2 3 1 5 8
// 3 1 2 1 3 5 8
// 3 5 多余两次
// 5 8
// 第四轮
// 2 1 1 2 3 5 8
// 2 3 多余三次
// 3 5
// 5 8
//比较的轮数 5个数比较4次
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 t = arr[j] ;
arr[j] = arr[j + 1]
arr[j + 1] = t // 交换
}
}
//每一轮拿到一次最大值
console.log(arr);
}
console.log(arr);
十九、选择排序
var arr = [8,5,3,2,1] ;
// 第一轮
// // 先找到最小值,再和第一个位置进行交换
// // 假设第一个位置上的数最小
var min = 0 ;
// 拿第一个位置上的数与后面的所有值做比较
for(var i = 1 ; i < arr.length ; i++){
if(arr[min] > arr[i]){
min = i
}
}
console.log(min);
//拿到最小值以后,与第一个位置上的值交换
var t = arr[0];
arr[0] = arr[min];
arr[min] = t ;
// 1 5 3 2 8
// 假设第二个位置上的数最小
var min = 1 ;
for(var i = 2 ; i < arr.length ; i++) {
if(arr[min] > arr[i]) {
min = i
}
}
console.log(min);
// 拿到最小值以后,与第一个位置上的值交换
var t = arr[1] ;
arr[1] = arr[min] ;
arr[min] = t ;
// 1 2 3 5 8
// 第三轮
// 假设第三个位置上的数最小
// 第四轮
var arr = [1,4,2,7,3,6];
for(var i = 0 ; i < arr.length - 1; i++){
// 假设第i个位置上的数是最小的
var min = i ;
// 拿这个最小的值和后面所有的数进行比较
for(var j = i + 1 ; j < arr.length ; j++){
//min对应的数比后面的大
if(arr[min] > arr[j]) {
min = j
}
}
console.log(min);
// 拿到最小值以后,与第一个位置上的值交换
if(min !== i) {
var t = arr[i]; // 交换
arr[i] = arr[min];
arr[min] = t ;
}
}
console.log(arr);
二十、数组的基本方法
// push(v1,v2,v3...) 向数组尾部追加值
// pop() 在数组尾部删除一个值
// unshift() 向数组的头部追加值
// shift() 向数组的头部删除一个值
var arr = [1,2,3];
// arr[3] = 'a' ;
arr.push('a' , 'b' , 'c');
console.log(arr); //尾部追加
arr.pop();
console.log(arr); //尾部删除
arr.unshift('hello' , 'hi');
console.log(arr); //头部追加
arr.shift();
console.log(arr); //头部删除
//用push 向尾部追加值的方法 实现在数组里放10个数
var arr2=[];
for(var i = 0 ; i < 10 ; i++ ){
// arr2[i] = i;
arr2.push(i)
}
console.log(arr2);
二十一、push封装
// 向一个数组中追加数据
// var arr = [1,2,3,4];
// arr[arr.length] = 'hello';
// console.log(arr); // [1,2,3,4,'hello']
// function push(n , n2 , n3){
// var arr = [1,2,3,4]
// arr[arr.length] = n ;
// arr[arr.length] = n2 ;
// arr[arr.length] = n3 ;
// console.log(arr);
// }
// push('a','b','h','t')
function push(){
var arr = [1,2,3,4];
// 用于接收实参列表 --- 伪数组
console.log(arguments);
for(var i = 0;i < arguments.length;i++){
console.log(arguments[i]);
arr[arr.length] = arguments[i];
}
console.log(arr);
}
push('a','b','h','t')
二十二、pop封装
// 删除数组中的最后一个值
function pop(){
var arr = [1,2,3,4,5]
var arr2 = []
//因为要娶不到最后一个5
for(var i = 0 ; i < arr.length-1 ; i++){
arr2.push(arr[i])
}
console.log(arr2);
}
pop()