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的范围,不可让表达式同时满足
- 条件表达式x为
true
,才执行代码块x;n个条件表达式都不为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 进行 全等 比较:
- 当比较结果为
true
时,执行相应的代码块;
- 否则,继续与 下一个表达式比较。
- 如果和所有表达式都不全等,执行
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语句是先执行后判断} do−while语句是先执行后判断
(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
就是循环要迭代的变量,若其为 null
或undefined
,将不执行循环体
(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 后查看