运算符
1. 赋值运算符
1.1定义
- 对变量进行赋值的运算符
- 运算符右边是值,左边必须是一个容器(即是一个变量)
1.2赋值运算符
- 变量+=数值
- 变量-=数值
- 变量*=数值
- 变量/=数值
- 变量%=数值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let num = 1;
// num = num + 1;
// 简化代码:采用赋值运算符的方法进行赋值
num += 3;
console.log(num);
</script>
</body>
</html>
2. 一元运算符
2.1分类
根据所需表达式的个数分为:
- 一元运算符
- 二元运算符
- 三元运算符
2.2自增运算符
- 符号:++
- 作用:让变量的值+1(只能加一)
- 注意:前置自增和后置自增在单独使用的时候没有区别
2.2.1前置自增
先自加再使用(++在前先加)
2.2.2后置自增
先使用后自加(++在后后加)
2.3自减运算符
- 符号:–
- 作用:让变量的值-1
2.3.1前置自减
先自减再使用(–在前先减)
2.3.2后置自减
先使用后自减(–在后后减)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let num;
num += 1;
let l = 0;
++l;
// 前置自增,结果是1
console.log(l);
let t = 2;
t++;
// 后置自增,结果是3
console.log(t);
let m = 3;
console.log(++m + 2);
// 结果是6,m先自加变成4,再和2相加
let n = 9;
console.log(n++ + 3);
// 结果是12,n先和3相加,在自加变成10
let i = 1;
console.log(i++ + ++i + i);
// answer是7
</script>
</body>
</html>
3. 比较运算符
3.1比较运算符的基础知识
- 比较运算符
- ==:左右两边值是否相等
- ===:左右两边是否类型和值都相等
- !=:左右两边是否不相等
- !==:左右两边是否不全等
- 结果
比较的结果为布尔类型,只会得到true
和false
3.2比较运算符的细节
- 字符串比较,是比较的字符对应的ASCII码
- 从左往右依次比较,one by one
- NaN不等于任何值,包括ta本身
- 涉及到NaN都是false
-
尽量不要比较小数
-
不同类型之间比较会发生隐式转换
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
console.log(5 > 10);
// answer是false;
console.log(10 >= 10);
// answer是true;
console.log(2 == 10);
// answer是false;
console.log("10" == 10);
// answer是true;存在隐式转换,把'10'字符串类型转换成数字型10,双等号只判断值
console.log("10" === 10);
// answer是false;三等号判断值和数据类型,以后使用三等号
console.log(NaN === NaN);
// answer是flase;NaN不等于任何东西
console.log('a'<'b');
// answer是true;
console.log('aa'<'ab');
// answer是true;第一个字符先进行比较,相等再对第二个字符进行比较,one by one
console.log('aa'<'aac');
// answer是true;
</script>
</script>
</body>
</html>
4.逻辑运算符
4.1逻辑运算符的基本知识
4.1.1场景
用来解决多重条件判断
4.1.2符号
符号 | 名称 | 日常读法 | 特点 | 口诀 |
---|---|---|---|---|
&& | 逻辑与 | 并且 | 符号&&两边都为true,结果才为true | 一假则假 |
ll | 逻辑或 | 或者 | 两边只要有一个true就为true | 一真则真 |
! | 逻辑非 | 取反 | true变成false,false变成true | 真变假,假变真 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
console.log(true && true);
// 两边都为true才是ture
console.log(false && true);
// 只要有一个是false就是false
console.log(3 < 0 && 4 > 1);
console.log(3 < 10 && 5 > 2);
console.log(false || true);
// 只要有一个是true就是true
console.log(false || false);
// 两边都是flase,才是flase
console.log(3 < 0 || 5 > 2);
console.log(!true);
// 结果是flase
console.log(!false);
// 结果是true
</script>
</body>
</html>
5.运算符优先级
优先级 | 运算符 | 顺序 |
---|---|---|
1 | 小括号 | () |
2 | 一元运算符 | ++,–,! |
3 | 算数运算符 | 先*,%,/,后+,- |
4 | 关系运算符 | >,>=,<,<= |
5 | 相等运算符 | != ,!== |
6 | 逻辑运算符 | 先&&,后ll |
7 | 赋值运算符 | = |
8 | 逗号运算符 | , |
语句
1. 表达式和语句
1.1表达式
表达式是可以被求值的代码,JavaScript引擎会计算出来一个结果
1.2语句
语句是一段可以执行的代码
1.3表达式和语句的区别
表达式可以被求值,而语句不一定有值
2. 分支语句
2.1程序三大流程控制语句
- 顺序结构:对代码从上往下执行
- 分支结构:需要根据条件选择执行代码,即有选择性的执行想要的代码
- 循环结构:某段代码被重复执行
2.2分支语句
2.2.1if分支
- 三种使用方法:
- 单分支
- 双分支
- 多分支
- 单分支使用语法:
if(条件) {
满足条件要执行的代码
}
注意
- 括号内条件有两个答案,true或者false
- 条件是true的时候,进入大括号里面执行代码
- 小括号内的结果不是布尔类型的时候,会发生隐式转换,转换成布尔类型
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
if (true) {
console.log("最后一天");
}
console.log("--------------------");
if (3 > 5) {
console.log("最后一天");
}
console.log("--------------------");
if (2 === "2") {
console.log("最后一天");
}
console.log("--------------------");
if (200000) {
console.log("最后一天");
}
// 所有的数字除了0以外,放在小括号里面,都是true
console.log("--------------------");
if ("sparkle是我") {
console.log("最后一天");
}
// 所有的字符串除了空字符串'',放在小括号里面,都是true
</script>
</body>
</html>
- 双分支if语法
if(条件) {
满足条件要执行的代码
} else {
不满足条件要执行的代码
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let year = +prompt("请输入要判断的年份:");
if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) {
alert(`${year}是闰年`);
} else {
alert(`${year}是平年`);
}
</script>
</body>
</html>
注意
- 两个代码必须要执行一个
- 多分支语句
if(条件1) {
代码1
} else if(条件2) {
代码2
} else if(条件3) {
代码3
} else if(条件n) {
代码n
}
注意
- 多个代码必须选择一个执行
- 依次判断变量满足哪一个条件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let grade = +prompt("请输入你的成绩");
if (grade >= 90 && grade <= 100) {
alert("你的成绩是优秀的");
} else if (grade >= 70 && grade < 90) {
alert("你的成绩是良好的");
} else if (grade >= 60 && grade < 70) {
alert("你的成绩是及格的");
} else {
alert("你的成绩是不及格的");
}
</script>
</body>
</html>
2.2.2三元运算符
- 场景
是比if双分支更为简单的一种写法 - 语法
条件?满足条件执行的代码:不满足条件执行的代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let num1 = +prompt("请输入第一个数字");
let num2 = +prompt("请输入第二个数字");
// let max =
num1 > num2 ? alert(`最大的数是${num1}`) : alert(`最大的数是${num2}`);
</script>
</body>
</html>
2.2.3数字补0案例
- 场景
为后期网页显示时间做准备 - 代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let num = prompt("请您输入一个数");
let num1 = num < 10 ? 0 + num : num;
alert(num1);
</script>
</body>
</html>
2.2.1switch语句
- 语法
switch(数据) {
case 值1:
代码1
break
case 值2:
代码2
break
default:
代码n
break
}
- 解释
- 找到和小括号里数据全等的case值,并且执行里面对应的代码
- 如果没有==全等==,就执行default里的代码
- 注意
- switch case 语句一般用于等值判断,不适合用于区间判断
- switch case一般需要配合break关键字使用,没有break会造成case穿透
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
switch (1) {
case 1:
console.log("我今天好困");
break; //退出switch
case 2:
console.log("要疯了");
break; //退出switch
case 3:
console.log("好想死");
break; //退出switch
default:
console.log("没有符合条件的");
}
</script>
</body>
</html>
3.循环语句
3.1断点调试
- 作用:更好理解代码的运行,还可以快速查找到bug
- 位置:检查里面的sources
- 断点:在某一句代码上加的标记就叫断点,程序由上而下地执行到这句被标记的代码时,会暂停下来
3.2while循环
3.2.1循环
while循环就是在满足条件期间,重复执行某些代码
3.2.2while循环基本写法
- 语法
while(循环条件){
要重复执行的代码(循环体)
}
- 解释
- 要满足循环条件是true才会进入循环体执行代码
- while大括号里面代码执行完毕之后不会跳出,而是继续回到小括号里判断是否满足条件,如果满足,则继续执行循环体,再回到小括号里判断是否满足条件;如果不满足,则跳出while循环
3.2.3while循环三要素
-
变量起始值
-
终止条件(没有终止条件会造成死循环)
-
变量变化量(一般用自增或者自减)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let i = 1;
while (i <= 10) {
document.write(
"<h4>无关风月,我题序等你回,悬笔一绝,那岸边浪千叠</h4><hr>"
);
i++;
}
</script>
</body>
</html>
3.3循环退出
3.3.1break
- 特点:
退出整个循环 - 作用:
一般用于结果已经得到,后续的循环不需要的时候可以使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let i = 1;
while (i <= 5) {
if (i === 4) {
break;
// 退出整个循环
}
console.log(`明天要上课${i}节课`);
i++;
}
</script>
</body>
</html>
3.3.2continue
- 特点:
结束本次循环,继续下一次循环 - 作用:
一般用于排除或者跳过某一个选项的时候可以使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let i = 1;
while (i <= 5) {
if (i === 4) {
i++;
// 先对变量i进行自增,如果没有,则会一直卡在这一步
// 需要先对变量i进行自增,不能在continue之后,若在其之后,将不会执行代码
continue;
// 退出本次循环,下方的代码不会再执行
}
console.log(`明天要上课${i}节课`);
i++;
}
</script>
</body>
</html>
循环-for
1. for循环基本使用
1.1用处
重复执行某一部分代码
1.2好处
把声明起始值、循环条件、变量变化量写到一起,和while之下更简介,清晰
1.3语法
for (变量起始值; 终止条件; 变量变化量){
需要重复执行的代码(循环体)
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
for (let i = 1; i <= 10; i++) {
// 一定会被执行,在判断i是否满足条件,满足则执行循环体代码,反之,退出循环
alert(`今天上午没有课,${i}很高兴`);
// 循环体代码
}
</script>
</body>
</html>
1.4for循环的最大价值:循环数组
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let names = ["梅", "兰", "竹", "菊"];
console.log(names[0]);
console.log(names[1]);
console.log(names[2]);
console.log(names[3]);
for (let i = 0; i <= names.length - 1; i++) {
// 必须从0开始,因为数组索引号是从0 开始的
// 数组的长度减一
// 第二种写法:for (let i = 0; i < names.length; i++) {
// 遍历数组:从头到尾的取出数组中的每个元素,从第一个循环到最后一个
// 如果找不到数组中的元素,则会出现未被定义的现象
document.write(`四大君子之一是${names[i]}<br>`);
}
</script>
</body>
</html>
1.5退出循环
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
for (let i = 1; i <= 5; i++) {
if (i === 2) {
continue;
// 当i= 2 时候,那一次循环continue代码之下的代码不会再执行,即是退出那一次循环
}
document.write(`我今天要听${i}首歌!<br>`);
}
</script>
</body>
</html>
1.6无限循环
- while的无限循环语法
while(true)
- for的无限循环语法
for(; ;)
2. for循环嵌套
2.1 语法
for(外部声明记录循环次数的变量;循环条件;变化值){
for(内部声明记录循环次数的变量;循环条件;变化值){
需要循环执行的代码
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
for (let days = 1; days <= 3; days++) {
// 外层循环打印 第n天
document.write(`第${days}天<br>`);
for (let num = 1; num <= 5; num++) {
// 内层循环打印 第n首歌
document.write(`我听了${num}首歌<br>`);
}
}
</script>
</body>
</html>
数组
1. 定义
1.1定义
array是一种可以按照某种顺序保存数据的数据类型
1.2用处
可以用一个变量保存一个数组,而数组中可以保存多个数据
2. 数组的基本使用
2.1声明语法
2.1.1语法
let 数组名[数据1,数据2,数据3,…,数据n]
2.1.2注意
- 数组是按照顺序保存,每一个数据都有自己的编号
- 编号是从0开始的
- 在数组中,数据的编号也叫索引或者下标
- 数组可以存储任意类型的数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let names = ["无关风月", "我题序等你回", "悬笔一绝那岸边浪千叠"];
// 用字面量声明数组
let arr = new Array(1, 2, 3, 4, 5);
// 使用new Array构造函数声明
document.write(arr);
document.write(names);
</script>
</body>
</html>
2.2取值语法
2.2.1语法
数组名 [ 下标 ]
2.2.2注意
- 数组是通过下标来取数据
- 取出是什么数据,就根据这种类型特点来访问
2.3一些术语
2.3.1元素
数组中保存的每个数据
2.3.2下标
数组中数据的编号
2.3.3元素长度
数组中数据的个数,通过数组的length属性获得
2.4遍历数组
2.4.1语法:
for(let i= 0;i<数组名。length;i++){
数组名[i]
}
2.4.2找到数组中的最大值和最小值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let arr = [2, 6, 1, 7, 4];
let max = arr[0];
let min = arr[0];
for (let i = 1; i <= arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
if (arr[i] < min) {
min = arr[i];
}
}
alert(`数组中最大的数是${max}`);
alert(`数组中最小的数是${min}`);
</script>
</body>
</html>
3. 操作数组
3.1修改
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let arr = [2, 6, 1, 7, 4];
document.write(arr);
document.write(arr[5]);
// 数组中没有下标为5的数据,所以会出现undefined
arr[5] = 9;
// 现在往下标为5的那个数据添加元素
arr[6] = 10000009;
// 现在往下标为6的那个数据添加元素
arr[0] = 0;
// 现在把下标为0的那个数据元素进行改变
document.write(arr[5]);
document.write(arr[6]);
document.write(arr);
let arr1 = ["li", "zhang", "liu", "zhao"];
// 现在想要改成li老师,zhang老师,liu老师,zhao老师
// 既然是所有的元素要修改,所以需要用到遍历
for (let i = 0; i < arr1.length; i++) {
arr1[i] = arr1[i] + "老师";
}
document.write(arr1);
</script>
</body>
</html>
3.2新增
3.2.1arr.push(新增加的内容)
- 定义
将一个或者多个元素添加到数组的末尾,并返回该数组的新长度 - 语法
arr.push(新增加的内容)
3.2.2arr.unshift(新增加的内容)
- 定义
将一个或者多个元素添加到数组的开头,并返回该数组的新长度 - 语法
arr.unshift(新增加的内容)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let arr = ["li", "zhang", "liu", "zhao"];
arr.push("yang", "hou");
// 一次可以加很多个,在原来数组之后加
arr.unshift("song");
// 一次可以加很多个,在原来数组之前加
document.write(arr);
document.write(arr.length);
</script>
</body>
</html>
3.3数组筛选
3.3.1案例1
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let arr = [2, 0, 6, 1, 77, 52, 0, 25, 7];
let arr1 = [];
// 声明一个新的数组,来存放满足条件的内容
for (let i = 0; i < arr.length; i++) {
// 实现数组的遍历
if (arr[i] >= 10) {
arr1.push(arr[i]);
// 满足条件的就在后面推入新的数组
}
}
document.write(arr1);
</script>
</body>
</html>
3.3.2案例2
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let arr = [2, 0, 6, 1, 77, 52, 0, 25, 7];
let arr1 = [];
// 声明一个新的数组,来存放满足条件的内容
for (let i = 0; i < arr.length; i++) {
// 实现数组的遍历
if (arr[i] !== 0) {
arr1.push(arr[i]);
// 满足条件的就在后面推入新的数组
}
}
document.write(arr1);
</script>
</body>
</html>
3.4删除
3.4.1arr.pop()
- 定义
从数组中删除最后一个元素,并且返回该元素的值
注意:一次只能删除一个 - 语法
arr.pop()
3.4.2arr.shift()
- 定义
从数组中删除第一个元素,并且返回该元素的值 - 语法
arr.shift()
3.4.3arr.splice(操作的下标,删除的个数)
- 定义
可以删除指定的元素 - 语法
arr.splice(操作的下标,删除的个数)
注意:- 起始位置:指定修改的开始位置(从0开始计数)
- 删除的个数:表示要移除的数组的元素的个数
- 如果没有给出删除的个数,那么就从指定的起始位置删除到最后
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let arr = [2, 0, 6, 1, 77, 52, 0, 25, 7];
arr.pop();
// ()里面什么都不需要写,一次只能删除一个元素,并且是最后一个
arr.shift();
// ()里面什么都不需要写,一次只能删除一个元素,并且是第一个
arr.splice(3, 2);
// 是从索引号3的位置开始删,只删除两个
// splice删除指定元素arr.splice(操作的下标(索引号),删除的个数)
// 如果没有给出删除的个数,那么就从指定的起始位置删除到最后,即索引号之后的数据会被全部删除
document.write(arr);
</script>
</body>
</html>