JS学习笔记(三)代码块、流程控制语句【附练习:水仙花数、判断质数】

发布于:2023-01-21 ⋅ 阅读:(491) ⋅ 点赞:(0)

JS学习笔记(三)

本系列更多文章,可以查看专栏 JS学习笔记



一、代码块

  • 1. 使用一组花括号 {} 将代码进行分组,每一个 {} 括起来的内容,称为代码块
  • 2. 一个代码块内的代码,要么全部都执行,要么都不执行
  • 3. 代码块内部的内容,外部是可见的

二、控制流程语句

1. 条件分支语句

(1)if 语句

	if(条件表达式){
		代码块
	}
  • 条件表达式true,才执行代码块;为false不执行语句

(2)if - else 语句

	if(条件表达式){
		代码块1
	}
	else{
		代码块2
	}
  • 条件表达式true,才执行代码块1;为false执行代码块2

(3)if - else if - if语句

	if(条件表达式1{
		代码块1
	}
	else if(条件表达式2{
		代码块2
	}
	else if(条件表达式3{
		代码块3
	}
	……
	else{
		代码块n+1
	}

要注意条件表达式1-n的范围,不可让表达式同时满足

  • 条件表达式xtrue,才执行代码块xn个条件表达式都不true时,代码块n+1执行

(4)switch语句

	switch(条件表达式){
		// 代码可以为多条语句,使用`break;`结束switch语句
		case 表达式1: 代码块1;break;
		case 表达式2: 代码块2;break;
		……
		case 表达式n: 代码块n;break;
		default: 代码块n+1;break;
	}

条件表达式结果 依次表达式x 进行 全等 比较:

    1. 比较结果true 时,执行相应的代码块
    1. 否则,继续与 下一个表达式比较
    1. 如果和所有表达式都不全等,执行 default 后面的代码块n+1

2. 循环语句

循环语句的循环体中,可以嵌套其它循环

(1)while 语句

	while(条件表达式){
		代码块
	}
  • 初次判断条件表达式的值true第一次执行代码块
  • 执行完语句后,再次对条件表达式的值进行判断,如果仍为 true ,则继续执行代码块否则,结束循环
  • 反复重复上一步,直到结束循环

(2)do - while 语句

	do{
		代码块
	}while(条件表达式)
  • 1. 先执行do后面的代码块
  • 2. 执行代码块完毕后,对条件表达式进行判断
  • 3. 条件表达式结果为true,继续执行代码块;否则,结束循环
  • 4. 反复执行上一步

w h i l e 语句是先判断后执行 \color{red}{while语句是先判断后执行} while语句是先判断后执行 d o − w h i l e 语句是先执行后判断 \color{blue}{do - while语句是先执行后判断} dowhile语句是先执行后判断

(3)for 语句

for(初始表达式;条件表达式;更新表达式){
	代码块
}
  • 1. 执行初始表达式后,对条件表达式结果进行判断,如果为true执行循环体否则,结束循环
  • 2. 执行完循环体后,执行更新表达式,再次对条件表达式结果进行判断,如果为true执行代码块否则,结束循环
  • 3. 反复执行上一步
for (let i = 1; i <= 5; i++) {
	let i = "abc";
	alert(i);
} // 因为括号内部和循环体内,属于2个作用域,可以都是用let申明变量,效果是弹窗输出了五次abc

创建死循环的方式:

1. for( ; ; ){}
2. while(1){}

(4)for-in语句

  • 是一种严格的迭代语句,用于枚举对象中的非符号键属性

对象的属性是无序的,不能保证对象属性的顺序,顺序取决于浏览器

for(const property in {a:1,b:2}){
	console.log(property);	// 输出a b
}

每次执行循环时,property 就是循环要迭代的变量,若其为 nullundefined,将不执行循环体

(5)for-of语句

  • 是一种严格的迭代语句,用于遍历可迭代对象的元素

for-of循环会按照可迭代对象的next()方法产生值的顺序,迭代元素

for(const value in {a:1,b:2}){
	console.log(value);	// 输出1 2
}

若尝试迭代的变量不支持迭代,则for-of语句会抛出错误

(6)break和continue语句

  • break: 可以结束整个switch语句,结束整个for循环,do-while、while循环。
  • continue: 可以结束当次循环,如果单次判断为false,只是单次不执行语句,还可以继续判断。

三、练习代码

1. 求1000以内的水仙花数

一个n位数(n>=3),它各个位数上的n次幂之和相加,等于其本身,则成为水仙花数

例如:153是一个3位数,n=3;1的三次幂等于1,5的三次幂等于125,3的一次幂等于27,1+125+27=153,故153是一个水仙花数。

代码如下,所示:

console.log("1000以内的水仙花数有:");
// 方法1:直接利用Number类型
for (let i = 100; i < 1000; i++) {
	// 获取百位上的数字,对结果进行取整
	let b = parseInt(i / 100);
	// 获取十位上的数字,先获取i没有百位时的数字,用同样的方式求出十位上的数字
	let s = parseInt((i - b * 100) / 10);
	// 获取个位上的数字,使用对10取模获取个位的数字
	let g = i % 10;
	// 获取三个数字的三次方的和
	sum = b ** 3 + s ** 3 + g ** 3;
	// 如果相加的和与自身相等,则输出为水仙花数
	if (sum === i) {
		console.log(sum);
	}
}

// 方法2:将Number类型转换为String类型
for (let i = 100; i < 1000; i++) {
	// 将数值转换为字符串类型
	let str = i + "";
	// 字符串str第一位为str[0],利用隐式类型转换进行判断
	if (str[0] ** 3 + str[1] ** 3 + str[2] ** 3 === i) {
		console.log(i);
	}
}

2. 求1000以内的指数

质数为除了1和自身没有其它因数的数字,例如:2 3 5 7 11 ……

/*
	获取用户数字,(不考虑用户输入错误的情况)
    	-获取时为字符串,利用隐式类型转换字符串类型
*/

let count = 0;
for (let i = 2; i < 1000; i++) {
// 设置标志量flag初始值为true,当发现i有除了1和本身之外的因数,变为false
let flag = true;
/*
	一个数的因数一般成对出现,例如36的因数为
		- 1 36;2 18;3 12;4 9;6 6;9 12……
	故只需 判断在小于本身开根号的数,是否存在其它因数即可
		- 如果一个数没有整数平方根,通过这种方式,也可以缩短代码运行时间
*/
// j一定要可以等于i的平方根,否则会得到错误结果
for (let j = 2; j <= Math.sqrt(i); j++) {
	// 判断是否为i的因数
	if (i % j === 0) {
		flag = false;
		// 可以提前终止此循环,查看下一个i
		break;
	}
}
	// 如果flag始终为true,说明没有其它因数,i为质数
	if (flag === true) {
		count++;
		console.log(i);
	}
}
console.log(`1000以内共有${count}个质数`);

结尾

部分内容参考《ECMAScript 6 入门》《JavaScript权威指南》《JavaScript高级程序设计》,如有错误,欢迎评论区指正。

本文含有隐藏内容,请 开通VIP 后查看