排序
一. 冒泡排序
元素和相邻最近的元素比较
1. 外层循环-1;
2. 内层循环-1-i;
3. 内循环相邻比大小;
4. 邻里交换位置
var arr = [3, 5, 8, 4, 7, 6];
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 tmp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = tmp;
}
}
}
console.log(arr);
复制代码
二 . 选择排序
和每一个元素和其他元素比较
var arr = [3, 5, 8, 4, 7, 6];
for (var i = 0; i < arr.length; i++) { //台上i
for (var j = i+1; j < arr.length; j++) { //台下j
if (arr[i] > arr[j]) {
var tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
}
}
}
console.log(arr);
复制代码
三 . 快速排序
-
找到中间的下标
-
通过中间的下标,找到中间数
-
定义左边的数组
-
左边 + 中间数 + 右边数,这里使用的是 函数的递归
-
设置一个变量 接受函数
var arr = [2, 4, 6, 3, 5];
function fnt(arr) {
if (arr.length <= 1) {
return arr; //如果数组小于等于1, 就不动数组
}
//1. 找到中间的下标
var mIndex = Math.floor(arr.length / 2);
//2. 通过中间的下标,找到中间数
var mVal = arr.splice(mIndex, 1)[0];
var leftArr = []; // 定义左边的空数组
var rightArr = []; // 定义右边的空数组
for (var i = 0; i < arr.length; i++) {
if (arr[i] > mVal) {
rightArr.push(arr[i]);
} else {
leftArr.push(arr[i]);
}
}
// 左边 + 中间数 + 右边数,这里使用的是 函数的递归
return fnt(leftArr).concat(mVal, fnt(rightArr));
}
var res = fnt(arr); //设置一个变量 接受函数
console.log(res);
去重
imdexOf, 如果找到啦就返回下标,找不到就返回-1;
function fn1(list) {
var tempArr = []; //一个空数组
for (var i =0; i <list.length; i++) {
if (tempArr.indexOf(list[i]) == -1) {
tempArr.push(list[i]);
}
}
return tempArr;
}
运算符
1. null
- null表示没有对象, 没有值
- 作为函数的参数 ,表示该函数的参数不是对象
- 是作为对象原型的终点
2. undefined
- undefined表示缺少值, 有值没有定义
- 定义了形参 , 没有传实参 ,显示undefined
- 对象属性名不存在时 ,显示undefined
- 函数没有写返回值, 也就是没有写return ,得到的是undefined
- 写了return, 但没有赋值, 拿到的值undefined
3.null和undefined转换成number数据类型
- null默认为 0
- undefined默认是 NaN
4. 总结
-
string bool 有内容就是true
-
numder bool 非0就是true (-1也是true)
-
obj bool 不是null的就是true,是null就是false
-
undefined bool 始终都是false
-
parseInt 取值 会丢失精度
-
parseFloat 保留小数
5. 逻辑运算符
-
&& (与)
-
|| (短路运算算符)(或) (取真)
-
! (非)
6.关系运算符
-
<, >=, <=, ==, ===, !=, !==
7.== 和 ===的比较
-
1). == 比较值相等, 例 : 5=="5" 纸币5元和硬币5元值相等
-
2). ===值和类型, 纸币5元和硬币5元
8.自增,自减
-
++ , --
-
a++ : ++在后 ,先取值, 后运算
-
++a : +=在前 ,先运算, 后赋值
9.类型转换
- parseInt ()
- parseFloat()
- Boolean () 其他类型转换至boolean类型 , 强制转换
- Number()
- toString() 或 String()
10. 隐式转换, 自动转换
- 可以利用 - , * , / 进行自动转换 == 也会进行自动转换
- eg: 1 == true
逻辑分支
1. if分支的语法
// 单分支语法
if (表达式) {
//逻辑代码
};
// 多分支语法
if ( ) {
} else if ( ) {
} else {
};
2. switch 分支 语法
- switch 是比较严格 要 恒等于比较值 和内容相等才是true
switch (表达式) {
case 条件1:
// 逻辑代码
break;
case 条件2:
// 逻辑代码*
break;
case 条件3:
// 逻辑代码
break;
default:
break;
}
循环
1.while循环语法
// 打印100以内的奇数
var num = 0;
while (num < 100) {
num++;
if (num % 2 != 0) {
console.log(num);
}
}
2. do...while..语法
- do..while..先执行,后判断,不管条件是否满足
// 打印100以内的奇数
var num = 0;
do {
if (num % 2 != 0) {
console.log(num);
}
num++;
} while (num < 100)
// 示例:计算1+2+3+……+100之和。
var num = 0;
var sum = 0;
do {
sum=sum+num;
num++;
}
while (num <= 100)
console.log(sum);
3.for循环 语法 (固定循环)
- for 有固定次数的情况下, 有限使用for
// 简洁的for死循环
for( ; ; ){ .. .. }
// 示例:计算1+2+3+……+100之和。
var sum=0;
for (var i =0; i <=100; i++) {
sum = sum +i;
}
console.log(sum);
4.for(...of...){ ... }不支持普通对象的遍历
var arr = ['1', '2', '3'];
for(var i of arr) {
console.log(i);
}
5.forEach
data=[{name:"张三",age:"12"},{name:"李四",age:"16"},{name:"王五",age:"19"}]
data.forEach((item, index)=> {
console.log(item,index)
});
6. 过滤方法 filter()
// 示例 查询数组里的偶数
var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var newArray = array.filter((item, i, arr) => {
return item % 2 === 0;
})
console.log(newArr); //输出结果:[2, 4, 6, 8, 10]
break 的扩展
-
break 能在switch中使用, 能在for中使用
-
默认是结束就近层循环,也可以结束指定层循环;
-
continue 的作用, 结束当次循环,并不是结束整个循环,
-
continue后面的语句不再执行, 只能在循环里面
aaa: for (var i = 0; i < 5; i++) {
console.log("i :" + i)
bbb: for (var j = 0; j < 3; j++) {
console.log("j : " + j);
break aaa;
}
}
arguments 伪数组扩展
- 只有在函数内部才有的特殊的变量,叫做arguments
-
arguments又叫做 伪数组 它的指针_ _proto__是Obuject
-
arguments的作用 是动态获取实参