JavaScript基础(四)
冒泡排序
// 准备一个需要进行排序的数组
var arr = [12, 88, 154, 23, 32, 15, 72, 2, 1, 66];
// 根据分析出的规律进行代码实现
// - 外层循环控制轮数:length - 1
for (var i = 0; i < arr.length - 1; i++) {
// - 内层循环控制每轮比较次数:
// - 设置条件时发现只 - i 不够,少了1,再设置一个 - 1 凑数
for (var j = 0; j < arr.length - i - 1; j++) {
// 比较当前项和后项的大小
// - 索引自动递增,后项的索引一定比当前项大1
if (arr[j] > arr[j + 1]) {
// - 交换两个位置的值即可
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
console.log(arr);
对冒泡排序的改进
/*
小问题:
- 规律中分析的是通用结论,每个数组需要比较length-1轮
- 实际情况是,某些数组可能不需要这么多轮就可以排序完毕
改进方式:
- 希望可以在确定数组排序完毕后,将操作结束(多余的轮数就不执行了,提高效率)
- 主要的点是:
- 如何确定排序完毕
- 实现方式:检测,某一轮中,是否进行了交换操作
- 如果某轮没有发生交换操作,说明排序完毕,break结束即可
改进结果:
- 达到了减少不必要轮数的目的
- 执行的轮数比实际交换的轮数多1,因为最后一轮为结果的验证。
*/
// 准备一个需要进行排序的数组:
// 这个数组其实只需要1轮就可以排序完毕,但是实际执行5轮
var arr = [16, 8, 32, 53, 25, 3, 4, 5, 16];
// 根据分析出的规律进行代码实现
// - 外层循环控制轮数:length - 1
for (var i = 0; i < arr.length - 1; i++) {
// 在某轮代码开始时,声明一个变量保存状态
var flag = '默认一开始没进行过交换';
// console.log('执行了一轮操作');
// - 内层循环控制每轮比较次数:
for (var j = 0; j < arr.length - i - 1; j++) {
// 比较当前项和后项的大小
if (arr[j] > arr[j + 1]) {
// - 交换两个位置的值即可
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
// 如果进入了if,进行了交换操作,修改flag的值
flag = '不好意思,交换了';
}
}
// 本轮中所有比较都执行完毕后,检测flag的最终状态
// - 如果还是默认值,说明没有进行交换,说明排序完毕,应该break结束
if (flag === '默认一开始没进行过交换') {
break;
}
}
console.log(arr);
数组的去重操作
例如:某个数组中具有一些重复的元素,通过操作得到新数组,新数组中的元素不重复。
var arr = [1, 1, 2, 2, 3, 3, 4, 5]; 处理后得到 var result = [1, 2, 3, 4, 5];
var arr = [1, 1, 2, 2, 3, 12, 22, 22, 2, 3, 3, 4, 6, 5, 7, 2, 11, 3];
// 1 声明一个用来保存结果的数组,这个数组的最终结果是不能重复的
var result = [];
// 2 遍历arr获取元素
for (var i = 0; i < arr.length; i++) {
// 希望将arr[i]放入到result中,前提是result中没有这个值
// 需要检测arr[i]和result中的每个元素的关系
// - 注意:需要确保arr[i]和result中每个元素都不相同,而不是某一个不相同
// - 针对当前arr[i]设置一个变量保存状态
var flag = '默认没有一样的值';
// 3 遍历result获取元素
for (var j = 0; j < result.length; j++) {
// 4 比较arr[i]和result[j]的关系
if (arr[i] === result[j]) {
// 5 如果找到相同的值,修改flag
flag = '不好意思,找到了相同的值,不能放入了';
// 找到了某个值相同后,后面的值就没必要检测了,结束即可
break;
}
}
// 6 当所有值检测完毕后,判断arr[i]是否可以放入
// - 如果flag还是默认值,可以放入
if (flag === '默认没有一样的值') {
// 7 将arr[i]放入到result中
result[result.length] = arr[i];
}
}
console.log(result);
函数
如果希望代码可以重复使用,并且灵活性强,可以使用函数操作(循环就不行了)
函数就是一个可以重复使用的代码块
声明方式
// 函数声明语句
function 函数名 () {
// 函数体
}
// 函数表达式
var 函数名 = function () {
// 函数体
};
函数的调用
函数的代码如果要执行,需要进行调用操作
格式: 函数名();
函数的基本设置方式:
设置一个函数功能的基本步骤:
先实现具体功能
随便设置一个函数体,将代码放入即可
在需要使用功能的地方调用即可
函数的参数:
参数的使用场景:当一个函数中某些值会发生改变时,可以使用参数
形参:函数体小括号中书写的参数
实参:调用的小括号中
用来给形参赋值,赋值后形参带着值进行函数内代码操作
function getSum (n, m) {
var sum = 0;
for (var i = n; i <= m; i++) {
sum += i;
}
console.log(sum);
}
getSum(1, 100);
getSum(200, 300);
getSum(1, 10);
函数的返回值
函数的返回值指的是函数的结果。
在函数中设置 return 值;
接收方式:通过函数调用表达式进行接收
function getSum (n, m) {
var sum = 0;
for (var i = n; i <= m; i++) {
sum += i;
}
// console.log(sum);
// 如果希望在函数外获取函数的计算结果,需要使用返回值
// - 格式: return 值;
return sum;
}
// 希望在函数外对本次调用的结果进行其他操作
// getSum(1, 100);
// console.log(sum);
// 函数内的变量无法在函数外操作,出现了报错:
// Uncaught ReferenceError: sum is not defined 没有sum,没法用
// 接收返回值的方式:通过函数的 调用表达式。
console.log( getSum(1, 100) ); // 5050
var result = getSum(1, 100);
console.log( result ); // 5050
函数返回值的默认值:undefined
return的第二个作用:结束函数执行
可以单独使用
作用域
作用域指的是js中标识符(变量名、函数名)的生效范围。
全局作用域:
只要不在函数内,都称为全局作用域。
局部作用域
任意函数内都称为局部作用域
全局变量和函数
全局作用域中声明的变量和函数称为全局变量和全局函数
访问范围:在任意位置均可访问
局部变量和函数
局部作用域中声明的变量和函数称为局部变量和局部函数
访问范围:只能在当前作用域内部访问(无法被外部作用域访问)
内部可以访问,内部的内容也可以,内部的内部的。。的内部也可以
原文地址:https://www.cnblogs.com/itxcr/p/11600138.html
时间: 2024-10-13 22:48:06