JS语句
什么是语句
- ECMA-262 规定了一组流程控制语句。语句定义了 ECMAScript 中的主要语法,语句通常由一个或者多个关键字来完成给定的任务。诸如:判断、循环、退出等。
- 语句主要分为:声明、分支控制、循环控制、流程控制、异常处理等。
声明语句
声明语句包含三种:声明变量、声明函数和声明标签
// 声明函数 使用function关键字
function f() {}
// 声明变量
var a = 1;//有声明提升 作用域按照函数计算
let b = 2;//无声明提升 作用域按照代码块计算
const MAX = 100;//无声明提升 常量 不能被修改或者重新赋值
// 声明标签Label:
// 声明语句一般都是配合continue和break来使用的,在后边流程控制语句中讲解
for1:
for (var i = 0;i<3;i++){
}
调试语句
- debugger语句用于停止JS
- debugger语句可以放在代码的任何位置用以脚本中止执行,但是不会关闭任何文件或者删除变量,类似在代码中设置断点
for (var i = 0; i < 5; i++) {
debugger;
console.log(1);
}
if语句
单分支if
- 书写格式:
if (判断式){代码块} - 如果判断式为真,则执行代码块。
- 判断式不一定要书写各种操作符,无论传递什么进去,if都会把它转换成布尔值 然后执行if代码
- 一般有 ( 当。。。。的时候 否则。。。。的时候 )使用if语句
- if判断语句的代码块是单句,我们可以省略大括号(但是js中不建议这样书写)

//【单分支if】声明变量 a、b,且赋值 a 和 b 都等于5;当 a 等于 b 时,重新对 b 赋值为10,并弹出 b 的新值
var a = 5 , b = 5 ;
// 如果a不等于b 那么整个if就不会执行 因为没有else
// js是允许只书写if 不书写else 的
if ( a == b ){
b = 10;
alert(b);
}
双分支 else语句
- else语句仅在if或者else/if语句的条件表达式为假的时候执行。
if(判断式){代码块1}else{代码块2}- 如果判断式为真,则执行语句1,否则将执行语句2

//【双分支】声明变量 a赋值为100;当 a 大于 50 时,弹出“a真大”,否则弹出“a真小”
var a = 100;
if (a > 50){
alert("a真大");
}else{
alert("a真小");
}
//【双分支】y值和x值相关。X大于等于3时,y值为2。X小于3时,y值为1
var y = 4,x = 2;
if (x >= 3){
y = 2;
}else{
y = 1;
}
//【双分支】如果x大于y成立,则x值为y值加1,否则x值为y值减1
var x = 3,y = 4;
if (x > y){
x = y + 1;
}else{
x = y - 1;
}
//【双分支】如果x大于y或者x小于z成立,则x值为z值,否则x值为y值
var x = 1,y = 2,z = 3;
if (x > y || x < z) {
x = z;
}else{
x = y;
}
else if语句
- else if语句 可以构成多分支
if (条件表达式) {语句1;} else if (条件表达式) {语句2;} ... else {语句3;}

// 【多分支】如果x值为3,y值为2,如果x值大于3,y值为1,如果x值小于3,y值为4
var x = 3,y = 4;
if (x == 3){
y = 2;
}else{
// x不等3的情况 进入else
if (x >3){
y = 1;
} else{
y = 4;
}
}
//else if()是在上一次判断的基础上 在剩下的条件中继续判断
if (x == 3){
y = 2;
}else if (x > 3){
y = 1;
}else{
y = 4;
}
//【多分支】x值为2,y值为1,如果x值比2小,y值为0,如果x值比10大,y值为10,如果x值小于4且大于3,y值为5,其他情况y为3
var x = 2, y = 1;
if (x < 2){
y = 0;
}else if (x >10){
y = 10;
}else if(x < 4 && x > 3){
y = 5;
}else{
y = 3;
}
if语句的练习
用户输入成绩 然后弹出成绩的等级

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>if语句的练习</title>
</head>
<body>
请输入成绩(数字):
<input type="text" id="ipt">
<p>等级:<span id="con"></span></p>
<script>
/*
* 用户输入成绩 然后弹出成绩的等级
* 成绩是 >=90 A >=80 <90 B >=70 <80 C >=60 <70 D 其他 Z
*/
var oIpt = document.getElementById("ipt");
var oCon = document.getElementById("con");
oIpt.onchange = function () {
// 获取表单的值,并转换成数值
var userScroe = parseInt(this.value);
if (userScroe >= 90){
oCon.innerHTML = "A";
}else if(userScroe >= 80){
oCon.innerHTML = "B";
}else if(userScroe >= 70){
oCon.innerHTML = "C";
}else if(userScroe >= 60){
oCon.innerHTML = "D";
}else{
oCon.innerHTML = "Z";
}
}
</script>
</body>
</html>
switch语句
-
switch语句专门用来设计多分枝条件结构。与else/if多分支结构相比,switch结构更加简介,执行效率更高。
-
语法如下:
switch(表达式){case value1:语句1;break; case value2:语句2;break; ………… default:语句 }- switch语句根据表达式的支,一次与case后的表达式的value值进行比较。如果相等,则执行其后的语句段,只遇到break,或者switch语句结束才中止,如果不想等,则继续查找下一个case。
- switch语句包含了一个可选的default语句(switch的异常处理),如果前边的case没有找到相等的条件,则执行default语句,它与else语句类似。
- switch语句是使用全等(===)来检测两个只的相等与否。所以会有一个值类型的比较
- case后可以是一个空语句,把多个条件放在一起检测
- 在switch语句中,case子句只是指明了执行的起点,但是没有指明终点,如果case后没有break语句,就会发生连续执行的情况,而忽略后边case的条件限制。
var a = 6;
switch (a) {
case 1:
alert(1);
// break;
case 2:
alert(2);
// break;
case 3:
alert(3);
// break;
case 4:
alert(4);
break;
case 5:
case 6:
case 7:
alert(8);
break;
default:
alert(10)
}
-
练习
用户输入成绩 然后弹出成绩的等级
![]()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>switch练习</title> </head> <body> 请输入成绩(数字): <input type="text" id="ipt"> <p>等级:<span id="con"></span></p> <script> /* * 用户输入成绩 然后弹出成绩的等级 * 成绩是 100-->S >=90 A >=80 <90 B >=70 <80 C >=60 <70 D 其他 Z */ var oIpt = document.getElementById("ipt"); var oCon = document.getElementById("con"); oIpt.onchange = function(){ //获取用户输入的成绩 var userScore = this.value; // 因为switchdo都是相等判断 所有我们都取 分数的第一位 然后判断相等 比如所有的90分以上 都是9开头 userScore = parseInt(userScore / 10); switch (userScore) { case 10: oCon.innerHTML = "S"; break; case 9: oCon.innerHTML = "A"; break; case 8: oCon.innerHTML = "B"; break; case 7: oCon.innerHTML = "C"; break; case 6: oCon.innerHTML = "D"; break; default: oCon.innerHTML = "D"; } } </script> </body> </html>
循环语句
在程序开发中,存在大量的重复性操作或计算,这些任务必须依靠循环结构来完成。JS提供了 while for do/while三种类型的循环语句。
while语句
-
while语句是最基本的循环结构。语法格式如下:
while(判断式){
语句
}
-
当判断式为真的时候,执行语句。执行结束之后再次进行判断,直到判断式为假,才跳出循环。
![]()
// 用while()循环来计算1+2+3 ... +98+99+100的值。
var i = 1;
var num = 0;
while(i <= 100){
num += i;
i ++;
}
console.log(num);
// 也可以在循环语句中添加增量
var i = 1;
var num = 0;
while(i++ <= 100){
num += i;
}
//每次执行时,要让条件发生变化,否则将进入死循环
var a = 4;
while(a < 7){
console.log(a);
a ++ ;
}
// 将1-100之间 3的倍数找出来 并打印
var i = 1;
while(i <= 100){
if (i % 3 == 0){
console.log(i);
}
i++;
}
do/while语句
-
do/while与while循环非常相似,区别在与表达式的值是每次循环结束后去检查,而不是开始去检查。
do{
语句
}while(判断式子)
-
因次do/while循环能够保证至少执行一次循环。而while就不一定了。

//基础使用
var a = 3;
do{
console.log("hello");
}while(a < 1);
// 用do-while()循环来计算1+2+3 ... +98+99+100的值:
var i = 1;
var num = 0;
do{
num += i;
i ++;
}while(i <= 100);
console.log(num)
练习-计算年利率
用户输入一个钱数 年利率为1.05(去年的利息和本钱 是下一年的本金) 翻倍需要几年

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>计算年利率</title>
</head>
<body>
<input type="text" id="ipt">
<script>
/*
* 用户输入一个钱数 年利率为1.05(去年的利息和本钱 是下一年的本金) 翻倍需要几年
*/
var oIpt = document.getElementById("ipt");
var scale = 1.05;
oIpt.onchange = function () {
var userMoney = parseFloat(this.value);
var fatalMoney = 2 * userMoney;
var years = 0;
//当用户的钱只要小于翻倍的钱,那么就让循环一直执行
while(userMoney <= fatalMoney){
// 循环体中,让本金每次执行都翻1.05倍,每一年循环一次
userMoney *= scale;
//每执行一次循环 让年数加1
years ++;
}
alert("您的钱翻倍需要"+years+"年");
}
</script>
</body>
</html>
练习-判断登录
用户输入的账号和密码,只要账号不是laowang ,密码不是 88888,我们就一直提示请重新输入,否则 提出输入成功
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>判断登录</title>
</head>
<body>
<script>
// prompt是包含输入框 确认和取消的弹窗 用户输入的值就是这个prompt方法的返回值 如果用户没有输入或输入空 则返回null
//prompt第一个参数 是提示用户的话
//方法一
//1、页面刚进入 先弹窗让用户输入账号名和密码
var userName = prompt("请输入用户名");
var passWord = prompt("请输入密码");
//2、如果判断不正确 就一直让弹出输入账号名密码 所以可以考虑while循环
while(userName != "laowang" || passWord != "88888"){
// 3、密码输入错 或者 账号输入错误 就进入while执行 弹窗
userName = prompt("请输入用户名");
passWord = prompt("请输入密码");
}
alert("欢迎光临 老王")
// 方法二: 递归调用
var userName = prompt("请输入用户名");
var passWord = prompt("请输入密码");
//因为每次输入完都要判断 所以需要封装一个 函数
function isLogin() {
if (userName != "laowang" || passWord != "88888"){
userName = prompt("请输入用户名");
passWord = prompt("请输入密码");
isLogin();//递归算法(在函数中调用自身)
}else{
alert("欢迎光临 老王 你是老王吧")
}
}
isLogin();
</script>
</body>
</html>
for语句
-
for语句是一种更简洁的循环结构
for(表达式1;表达式2;表达式3 ){
语句1;
语句2……;
}
语句3
-
表达式1在循环开始前无条件的求值一次,而表达式2在每次循环开始前求值。如果表达式2的值为真,则执行循环语句,否则终止循环。表达式3在每次循环后被求值,然后再次判断。
/*
for循环执行顺序
1、首先执行语句1
2、执行判断式2 如果成立(返回true)则执行代码块 如果不成立(返回false) 整个循环结束
3、如果判断式成立去执行了代码块,执行完代码块 会去执行语句3
4、语句3执行完成后 再次去执行判断式2
5、重复第二个步骤
*/
// 假设 弹出你好 总共弹出5次
for (var i = 0; i < 5; i++) {
console.log("nei hao a");
}
// 练习:定义一个变量a=5,让a执行5次,每次a加3。然后弹出a最终的值。
var a = 5;
for (var i = 0; i <5 ; i++) {
a += 3;
}
console.log(a);
for循环的练习
- 求1到9的和
- 求1到100的和
- 求1-99中的单数的和
- 求1-99中是3的倍数的数字和
- 定义一个v,当v等于0时,v进行3次自加1。否则v进行4次自加2
- 定义v=3;对变量i由0到3进行遍历;当i 等于2时,v自加2;否则v自加3
//1、求1到9的和
// 1+2+3+4+5+6+7+8+9
// 定义一个变量保存和 默认是0
var num = 0;
for (var i = 1; i < 10; i++) {
num += i;
}
console.log(num);
// 2、求1到100的和
var num = 0;
for (var i = 1; i < 101; i++) {
num += i;
}
console.log(num);
// 3、求1-99中的单数的和
var num = 0;
for (var i = 1; i < 100; i+=2) {
num += i;
}
console.log(num)
// 4、求1-99中是3的倍数的数字和
var num = 0;
for (var i = 3; i < 100; i+=3) {
num += i;
}
console.log(num)
var num = 0;
for (var i = 0; i < 100; i++) {
if (i % 3 == 0){
num += i;
}
}
console.log(num)
// 5、定义一个v,当v等于0时,v进行3次自加1。否则v进行4次自加2
var v = 3;
if(v == 0){
for (var i = 0; i <3 ; i++) {
v++;
}
}else{
for (var i = 0; i <4 ; i++) {
v += 2;
}
}
// 6、定义v=3;对变量i由0到3进行遍历;当i 等于2时,v自加2;否则v自加3
var v = 3;
for (var i = 0; i < 4; i++) {
if (i == 2){
v += 2;
}else{
v += 3;
}
}
for循环的应用
对所有的li绑定点击事件 点击谁 让谁的背景颜色变成红色

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>for循环应用</title>
</head>
<body>
<ul id="box">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<script>
/*
* 效果 对所有的li绑定点击事件 点击谁 让谁的背景颜色变成红色
* 1、获取标签
*/
// 1、获取标签
var oBox = document.getElementById("box");
var oLis = oBox.getElementsByTagName("li");
/*oLis[0].onclick = function () {
this.style.backgroundColor = "red";
}
oLis[1].onclick = function () {
this.style.backgroundColor = "red";
}
oLis[2].onclick = function () {
this.style.backgroundColor = "red";
}
oLis[3].onclick = function () {
this.style.backgroundColor = "red";
}
oLis[4].onclick = function () {
this.style.backgroundColor = "red";sd
}*/
/* for (var i = 0; i < oLis.length; i++) {
oLis[i].onclick = function () {
this.style.backgroundColor = "red";
}
}*/
/*
* 效果 对偶数个数的(0 2 4 6 8 10)li绑定点击事件 点击谁 让谁的背景颜色变成红色
* 1、获取标签
*/
var oBox = document.getElementById("box");
var oLis = oBox.getElementsByTagName("li");
for (var i = 0; i < oLis.length; i += 2) {
oLis[i].onclick = function () {
this.style.backgroundColor = "red";
}
}
</script>
</body>
</html>
九九乘法算表

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>九九乘法算表</title>
</head>
<body>
<div id="box">
</div>
<script>
var oBox = document.getElementById("box");
for (var i = 1; i < 10; i++) {
// 第一个for控制行的
for (var j = 1; j <= i; j++) {
// 第二个for 执行这一行的 签的乘数
var math = j + "*" + i + "=" + j*i+" ";
console.log(math)
oBox.innerHTML = oBox.innerHTML + math;
}
// 在每一行执行结束后,添加一个换行
oBox.innerHTML += "<br>";
}
</script>
</body>
</html>
流程控制
使用break、label、continue、return语句可以中途改变分支结构、循环结构的流程方向,以提升程序的执行效率。return在函数中会做详细讲解。
label语句
- 在JS中,label语句可以为一行语句添加标签,以方便在复杂的结构中设置跳转目标。
- 语法如下:
label:语句 - label可以是任意合法的标识符,然后使用冒号分割标签名与标签语句。
- label和break语句配合使用,主要应用在循环结构、多分枝结构中,以便与跳出内层嵌套体。
var num=0;
outermost:
for(var i=0; i<10;i++){
for(var j=0; j<10; j++){
if(i==5 && j==5){
break outermost;
}
num++;
}
}
console.log(num);
break语句
- break语句能够结束当前for、for/in、while、do/while或者switch语句的执行。同时break可以接受一个可选的标签名,来决定跳出的结构语句。
- 如果没有设置标签名,则跳出当前最内层结构。
//break 是立即退出循环 或 退出switch语句 执行循环后边的代码
var num =0 ;
for ( var i=0 ; i<5 ; i++ ) {
if ( i == 3 ) {
break;
}
num++;
}
alert( num );
var num=0;
outermost:
for(var i=0; i<10;i++){
for(var j=0; j<10; j++){
if(i==5 && j==5){
break outermost;
}
num++;
}
}
console.log(num);
continue语句
- continue语句用在循环结构内,用于跳出本次循环中剩余的代码,并在表达式的值为真的时候,继续执行下一次循环。
- 可以接受一个可选的标签名,来决定跳出的循环语句。
var num =0 ;
for ( var i=0 ; i<5 ; i++ ) {
if ( i == 3 ) {
continue;
}
num++;
}
alert( num );
var num=0;
outermost:
for(var i=0; i<10;i++){
for(var j=0; j<10; j++){
if(i==5 && j==5){
continue outermost;
}
num++;
}
}
console.log(num);
练习
- 求整数1~100的累加值,但要求碰到个位为3的数则停止累加
- 求整数1~100的累加值,但要求跳过所有个位为3的数
- 求1-100之间不能被7整除的整数的和(用continue)
- 求200-300之间所有的奇数的和(用continue)
- 求200-300之间第一个能被7整数的数(break)
异常处理
ECMA-262规范了7种错误类型。其中Error是基类,其他6种错误类型是子类,都继承了基类。Error类型的主要作用是自定义错误对象。
- Error:普通异常 。与thorw语句和try/catch语句一起使用,属性name可以读写异常类型,message属性可以读写详细的错误信息。
- EvalError:不正确使用eval()方法时抛出
- SyntaxError:出现语法错误时抛出
- RangeError:数字超出合法范围之抛出
- ReferenceError:读取不存在的变量时抛出
- TypeError:值的类型发生错误的时候抛出
- URIError:URI编码和解码错误时抛出
try/catch/finally语句
-
try/catch/finally语句是异常处理语句
try{
调试代码块
}
catch(e){
捕获异常,并进行异常处理的代码块
}
finally{
后期清理代码块
}
-
正常情况下,JS按顺序执行try子句中的代码,如果没有异常发生,将会忽略catch跳转到finally子句继续执行。
-
如果在try子句运行错误,或者使用throw语句主动抛出异常,则执行catch子句中的代码,同时传入一个参数,引用Error对象
// try catch 案例
try{
console.log(a);//当try中出现错误的时候,会直接进入catch执行
console.log("我是try");
}catch (e) {
console.log("catch");
console.log(e);//referenceError:a is not defined
console.log(e.name);//referenceError
console.log(e.message);//a is not defined
}
try{
console.log("try");
throw new Error("你是不是没有定义变量");
}catch (e) {
console.log("catch")
console.log(e);
console.log(e.name);
console.log(e.message);
}
try{
console.log("try");
// throw new Error("你是不是没有定义变量");
}catch (e) {
console.log("catch")
console.log(e);
console.log(e.name);
console.log(e.message);
}finally {
console.log('finally')
}
alert(1);
// throw是抛出错误
var a = 10;
if(a > 4){
// throw "你错啦吗?";
// throw new TypeError("你的类型错误");
var userError = "你今天犯错了,错误如下。。。。。。。。";
throw new SyntaxError(userError);
}
语句练习
收银程序
输入单价和数量,计算总价。如果总价大于500 则打八折。然后用户输入付钱,最终弹出找零。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>收银程序</title>
</head>
<body>
<script>
//输入商品的单价和数量
var price = prompt("请输入单价");
var count = prompt("请输入数量");
//计算总价
var sumPrice = price * count;
//判断是否打折
if (sumPrice >= 500){
sumPrice *= 0.8;
}
//给用户说需要付多少钱
var money = prompt("您本次消费"+sumPrice+"元,请付款(输入付钱的面额即可,稍等给您找零)");
// 判断用户缴费是否足够,并找零
if (money > sumPrice) {
// 计算找零
var reduceMoney = money - sumPrice;
alert("找零" + reduceMoney + "元,请收好")
}else{
alert("钱不够!!!!")
//此时可以重新递归调用,代码省略
}
alert("欢迎下次光临");
</script>
</body>
</html>
ATM按键
输入相应数字,执行相应功能

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ATM按键</title>
</head>
<body>
<script>
var userPress = prompt("欢迎光临银行,请输入数字选择功能(1.查询余额,2.取钱,3.转账,4.退出)");
switch (parseInt(userPress)) {
case 1:
search();
break;
case 2:
drag();
break;
case 3:
change();
break;
case 4:
exit();
break;
default:
alert("你丫看不懂提示么");
}
function search() {
alert("正在查询余额");
}
function drag(){
alert("正在取钱啊");
}
function change() {
alert("正在转账")
}
function exit() {
alert("正在退出")
}
</script>
</body>
</html>
买保险
公司给员工买保险(用户通过此程序查询自己是否符合条件):1.只要结婚的都买;2.没有结婚的男人 25岁以下不买;3.没有结婚的姑娘 22岁以下不买.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>买保险</title>
</head>
<body>
<script>
/*
* 公司给员工买保险(用户通过此程序查询自己是否符合条件):
* 只要结婚的都买
* 没有结婚的男人 25岁以下不买
* 没有结婚的姑娘 22岁以下不买
*/
//输入是否结婚
var isMarry = prompt("你结婚了吗?请输入yes和no");
var age = prompt("您今年高寿啊");
var sex = prompt("您性别是什么(man or woman)");
if (isMarry === "yes"){
alert("您放心做吧,公司给您提供免费的保险");
}else if ((sex === "man" && age < 25) || (sex === "woman" && age < 22)){
alert("自己回家买去吧");
}else{
alert("公司也给您买");
}
</script>
</body>
</html>


浙公网安备 33010602011771号