前序 - 流程图
- 一套的标准图形,用于描述程序的逻辑
绘制流程图
if判断
if(条件1){
// 代码块
}
else if(条件2){
// 代码块
}
else if(条件3){
// 代码块
}
//....
else{
// 以上条件都不满足执行的代码块
}
//例
var score = 95;
// A:>=90 B: >=70 <90 C: >=50 <70 D: <50
if (score >= 90) {
console.log("A");
} else if (score >= 70) {
console.log("B");
} else if (score >= 50) {
console.log("C");
} else {
console.log("D");
}
var result = prompt("请输入你的年龄");
if (result === null) {
console.log("点击了取消");
} else {
result = +result; //转换为数字
if (isNaN(result)) {
//不是正常的数字
console.log("输入有误");
}
else{
console.log(result, typeof result);
}
}
- 如果某个条件满足,则直接忽略后面的所有条件
- else if 可以有多个(包含0个)
- else可以有1个或0个
- else可以换行,可以不换行
- 如果代码块只有一条语句,可以省略花括号(不推荐)
- if只能出现一次
//例题 在计算机中输出石头剪刀布
var fist = propt("请输出(石头,剪刀,布)");
if(fist === '剪刀' || fist === '石头' || fist === '布'){
var rad = Math.random();
var pcFist; //计算机随机出拳
if(rad < 0.333){
pcFit = '石头'
}else if(rad < 0.666){
pcFit = '剪刀'
}else{
pcFit = '布'
}
}else{
console.log('输入有误')
}
//2. 比较胜负
console.log(`你的出拳:${fist}, 电脑出拳:${pcFist}`);
if(fist === "剪刀" && pcFist === '布' ||
fist === "石头" && pcFist === '剪刀' ||
fist === "布" && pcFist === '石头' ){
console.log('你胜利了')
}else if(fist === pcFist){
console.log('平局')
}else{
console.log('电脑胜利')
}
switch 开关
switch的语法始终可以使用if结构替代。
switch(表达式){
case 数据1:
代码块
case 数据2:
代码块
//...
default:
代码块
}
//例
var x = 20;
switch (x) {
case 1:
console.log("1");
break;
case 20:
console.log("20");
break;
case 30:
console.log("30");
break;
default:
console.log("default");
break;
}
- 计算表达式的返回值,依次和case后面的数据进行严格相等的比较,如果某个相等,停止比较,然后运行其内部的代码块,再然后,依次运行之后的所有代码块。
- 在case分支内部,使用break语句,可以立即停止switch结构。
- default表示前面的所有case都不匹配时运行。可以省略
循环
- 重复的运行一段代码
- JS支持3种循环结构:while循环、do-while循环、for循环
- 死循环:条件永远满足,永远无法退出循环。
while循环
while(条件){
代码块(循环体)
}
// 输出100个hello world
var i = 0; //当前输出的次数,初始化
while(i < 100){
console.log("hello world");
i++;
}
do-while循环
do{
//循环体
}while(条件)
// 输出100个hello world
var i = 0; //当前输出的次数
do {
console.log("hello world");
i++;
} while (i < 100);
console.log("循环结束");
for循环
for(初始化表达式; 条件; 条件改变表达式){
循环体
}
// 输出 1-100 的所有数字
for (var i = 1; i <= 100; i++) {
// 在循环体中,i的值从1变化到100
console.log(i);
}
// 输出 100-1 的所有数字
for (var i = 100; i >= 1; i--) {
console.log(i);
}
// 输出 1-100 的所有奇数
for (var i = 1; i <= 100; i++) {
// 判断i是不是奇数
if (i % 2 !== 0) {
console.log(i);
}
}
for (var i = 1; i <= 100; i += 2) {
console.log(i);
}
循环中的关键字
循环控制语句
- break; 跳出循环
- continue; 停止当前循环体,进入下一次循环。
var i = 0;
while (i < 10) {
if (i === 3) {
i++;
continue;
}
console.log(i);
i++;
}
for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
console.log(i, j);
if (i + j >= 2) {
break;
}
}
}
循环的应用
- 累计 (准备一个变量,初始值为0,然后1-100循环,每次循环,将数字累加到变量中)
- 查找 (准备一个变量,记录false,表示没有找到,然后135-145进行循环,如果发现满足条件的数字,重新记录变量为true,表示找到了,然后退出循环)
- 嵌套的循环
// 1-100 所有奇数相加
var sum = 0;
for (var i = 1; i <= 100; i++) {
if (i % 2 !== 0) {
sum += i;
}
}
console.log(sum);
// 135-145 之间是否存在 能整除26的数字
var isFind = false; //是否找到
var min = 135,
max = 145;
for (var i = min; i <= max; i++) {
if (i % 26 === 0) {
isFind = true;
break;
}
}
if (isFind) {
console.log("存在");
} else {
console.log("不存在");
}
// 打印1-100的所有素数
for (var i = 1; i <= 100; i++) {
// 判断i是不是素数
var isFind = false; //没有找到
for (var j = 2; j < i - 1; j++) {
if (i % j === 0) {
isFind = true;
break;
}
}
if (i > 1 && !isFind) {
console.log(i);
}
}
数组(源于Array.prototype)
- 用于存放多个数据
创建
1. new Array(长度)
- 长度,数组里面的数据总数,长度一定是一个非负整数
- new Array(数据, 数据, 数据....)
- 创建一个数组,并初始化其每一项的值
- 数组项:数组其中的一项数据
-
2. [数据,数据,数据,....]
- 创建一个数据,并初始化其每一项的值
var arr1 = new Array(20); //创建了一个长度为20的数组
//创建一个长度为5,数据分别是1,5,354,234,11
var arr2 = new Array(1, 5, 354, 234, 11);
//创建一个长度为5,数据分别是1,5,354,234,11
var arr3 = [1, 5, 354, 234, 11];
本质
数组的本质就是个对象
- length属性:数组的长度,会自动变化,值为最大下标+1
- 数字字符串属性:叫做下标,也叫做索引,相当于数组中每个数据的编号,下标从0开始排列
- 下标
下标通常都是连续的,下标不联系的数组叫做稀松数组- 注意:连续下标的取值范围:0 ~ length -1,如果给length直接赋值,会导致数组可能被截断,因此实际开发中,不要给length赋值。
var arr = [3, 6, 23, 4, 66, 232, 44];
arr.abc = "asdfasdfsadf";
// arr.length = 200;
arr[7] = 333;
console.log(arr);
添加数组项
- 数组[长度] = 数据:向数组末尾添加一个数据
- 数组.push(数据): 向数组末尾添加一个数据
- 数组.unshift(数据):向数组起始位置添加一个数据,会导致数组每一项的下标向后移动
- 数组.splice(下标, 0, 添加的数据): 从指定下标位置开始,删除0个,然后在该位置插入添加的数据,如果下标超过范围,则按照范围的边界进行处理。
push、unshift、splice可以添加多个数据
var arr = [1, 2, 3, 4];
// arr[arr.length] = "afasf"; //向末尾添加一项
// arr[arr.length] = "afasf1"; //向末尾添加一项
// arr[arr.length] = "afasf2"; //向末尾添加一项
// arr[arr.length] = "afasf3"; //向末尾添加一项
// arr.push("abc", "bcd");
// arr.push("bcd");
// arr.push({
// name: "Adsf",
// age: 18
// });
// console.log(arr);
// arr.unshift(1, 2, 3);
arr.splice(2, 0, "abc", "bcd");
console.log(arr);
删除数据
- delete 数组[下标]: 这种做法不会导致数组其他的属性发生变化,因此,该做法会导致产生稀松数组,所以不推荐使用该做法。
- 数组.pop(): 删除数组的最后一项,该表达式返回最后一项的数据
- 数组.shift():删除数组第一项,该表达式返回第一项的数据
- 数组.splice(下标, 删除的数量, 添加的数据): 从指定下标位置开始,删除指定数量,然后在该位置插入添加的数据,如果下标超过范围,则按照范围的边界进行处理。返回一个新数组,该数组记录被删除的数据。
var arr = [];
// delete arr[3];
// var n = arr.pop();
// var n = arr.shift();
var n = arr.splice(1, 1000);
console.log(arr, n);
其他操作
- 数组.slice(起始位置下标, 结束位置下标):将起始位置到结束位置之间的数据拿出来,得到一个新的数组,该函数不会改变原数组;注意:结束下标取不到
下标可以写负数,如果是负数,则从数组的末尾开始计算。
如果不写结束下标,则直接取到末尾。
- 数组清空
数组.splice(0, 数组.length);
数组.length = 0;
- 查找数组中某一项的下标
数组.indexOf(数据)
从数组中依次查找对应的数据,查找时使用严格相等进行比较。找到第一个匹配的下标,返回。如果没有找到,则得到-1;
数组.lastIndexOf(数据)
功能和indexOf类似,只是查找的是最后一个匹配的下标
- 数组.fill
数组.fill(数据):将数组的所有项,填充为指定的数据
数组.fill(数组, 开始下标): 将数组从开始下标起,到数组的末尾,填充为指定的数据
数组.fill(数组, 开始下标,结束下标): 将数组从开始下标起,到数组的结束下标(取不到),填充为指定的数据
var arr1 = [1, 2, 3, 4, 5, 6, 7];
var newArr = arr.slice(-4);
arr1.splice(0, arr.length);
console.log(newArr, arr1);
var arr2 = [1, 2, 3, 4, 3, 6, 3];
var index = arr2.lastIndexOf(3);
console.log(arr2, index);
var arr3 = new Array(100);
arr.fill("abc");
for (var i = 0; i < arr3.length; i++) {
arr3[i] = "abc";
}
for (var index in arr) {
arr3[index] = "abc";
}
console.log(arr3);
数组的静态成员
- from方法:可以将一个伪数组转换为真数组
- isArray方法:判断一个给定的数据,是否为一个真数组
- of方法:类似于中括号创建数组,依次赋予数组每一项的值
//伪数组转换为真数组
function test(){
console.log(Array.isArray(arguments));
var newArr = Array.from(arguments);
console.log(newArr, Array.isArray(newArr));
}
test(1,4,6,57,89,33)
数组的实例成员
- fill方法:用某个数据填充数组
- pop:从数组中删除最后一个元素,并返回该元素的值
- push: 将一个或多个元素添加到数组的末尾,并返回该数组的新长度
- reverse:将当前数组颠倒顺序
- shift: 从数组中删除第一个元素,并返回该元素的值
- sort:对数组进行排序
- splice: 通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容
- unshift: 将一个或多个元素添加到数组的头部,并返回该数组的新长度
- 以上方法会改变原数组
var arr = new Array(6); //fill 数组填充
console.log(arr.fill('a')); //[a,a,a,a,a,a]
var arr1 = [1,2,3,4,5]; //pop 返回删除的元素,并且改变了原数组
console.log(arr.pop(1),arr1); //5,[1,2,3,4]
var arr2 = ['a','b']; //push 由数组末尾添加元素,并且返回数组新的长度
console.log(arr2.push('c'),arr2); //3,[a,b,c]
console.log(arr2.reverse()); //[c,b,a];
console.log(arr2.shift(),arr2),//c, [b,a]
//sort //数组排序
var arr3 = [3, 211, 32, 11, 5, 4];
arr3.sort(function(a, b) {
return Math.random() - 0.5;
});
console.log(arr3);
//splice
var arr4 = [1,2,3,4];
console.log(arr4.splice(2,1),arr4); //[3],[1,2,4]
//unshift
var arr1 = [1,2,3,4,5];
console.log(arr.unshift(1),arr1); // 1 [2,3,4,5]
- 纯函数、无副作用函数:不会导致当前对象发生改变
- concat 两个或者多个数组进行合并
- includes: 数组中是否包含满足条件的元素 结果返回的类型为Boolear
- join: 将一个数组的所有元素连接成一个字符串并返回这个字符串
- slice 提取源数组的一部分并返回一个新数组
- indexOf 返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回 -1
- lastIndexOf 返回指定元素在数组中的最后一个的索引,如果不存在则返回 -1
- forEach: 遍历数组
- every:是否所有元素都满足条件
- some:是否至少有一个元素满足条件
- filter:过滤,得到满足条件的元素组成的新数组
- find: 查找第一个满足条件的元素,返回元素本身,如果没有找到,返回undefined
- findIndex: 查找第一个满足条件的元素,返回元素的下标
- map:映射,将数组的每一项映射称为另外一项
- reduce:统计,累计
var arr = [1,2,3,4,5]; var arr2 = ['a','b','c'];
var newArr = arr.concat(arr2);
console.log(newArr); // [1,2,3,4,5,'a','b','c'] 数组合并
var arr3 = [32, 6, 67, 3, 23, 4];
// 从数组下标3的位置开始寻找,目标是67
console.log(arr3.includes(67, 3)); //false
var arr4 = [1,2,3,4,5];
console.log(arr4.join(','));//1,2,3,4,5
//arrLice
var arrLice = [1,2,3,4];
console.log(arrLice.slice(1)); //[2,3,4]
var arr5 = [1,2,3,4,5];
arr5.forEach(function(v){
console.log(v);
}); //类似于for循环
var arr6 = [37, 25, 48, 55, 30];
//判断是否所有同学都及格
// var result = arr6.every(function(item) {
// return item >= 60;
// });
// console.log(result);
//判断是否至少有一个同学及格
console.log(arr6.some(function(item) {
return item >= 60;
}));
var arr7 = [1, 2];
var sum = arr7.reduce(function(s, item) {
return s + item;
}, 0);
console.log(sum);
var arr8 = [55, 66, 22, 33, 44, 88];
//得到一个新数组,新数组的每一项是一个对象
//对象中包含两个属性:name、score
var newArr4 = arr8.map(function(item, i) {
return {
name: "学生" + (i + 1),
score: item
}
});
console.log(newArr4);
// 链式编程:每一个函数调用返回的类型一致
var arr81 = [22, 33, 44, 55, 66, 77, 88];
// 先对数组进行随机排序
// 只取及格的分数
// 得到学生对象的数组(每个学生对象包含姓名和分数)
var result6 = arr81.sort(function() {
return Math.random() - 0.5;
}).filter(function(item) {
return item >= 60;
}).map(function(item, i) {
return {
name: `学生${i+1}`,
score: item
}
});
console.log(result6);
补充
- in关键字
判断某个属性是否存在
属性名 in 对象
// var obj = {
// a: 1,
// b: 324,
// c: "asdfas"
// };
// console.log("a" in obj);
var arr = [23, 65, 7, 7];
console.log(arr);
console.log(23 in arr);
- for-in 循环
取出对象的所有属性名,每次循环将其中一个属性名赋值给变量prop,运行循环体。
for(var prop in 对象){
//循环体
}
// 利用该特点,可以实现数组的遍历
var arr = ["abc", "bcd", "234", , , , 54, 2, 1];
console.log(arr);
// for (var i = 0; i < arr.length; i++) {
// console.log(arr[i]);
// }
for (var index in arr) {
console.log(index, typeof index, arr[index]);
}