Blogger Information
Blog 45
fans 3
comment 0
visits 45661
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JS模板字符串的认识、解构赋值与流程控制基础
残破的蛋蛋
Original
1946 people have browsed it

JS模板字面量的认识与流程控制

昨天学习了JS相关的基础知识,了解了JS变量、常量的声明,以及let、const的区别,今天学习了字符串模板和JS流程控制语句,下面我把今天所学的内容总结梳理一下,把重点知识跟大家分享一下,也便于日后我复习所用。

一、模板字面量

模板字面量是在字符串中允许插入表达式的字符串字面量,我们可以使用多行字符串和字符串的插值功能。在ES2015(即:ES6)规范的先前版本中被称为“模板字符串”。

  • 语法

` string `

` string ${expression} `

` string ${expression} string `

  • 解释

模板字符串是增强版的字符串(Plus+),使用反引号(` `)来替代普通字符串中的单双引号,其中${expression}表示占位符。

注意在模板字符串中如果想使用反引号(`)需要加一个转义符(\),即:\`

  • 普通字符串
  1. console.log('This is my first JS Code');
  • 效果图:
    普通字符串

  • 多行字符串

在以前的字符串中,如果我们想要多行字符串,需要用到换行符(\n),例如:

  1. console.log('This is my first JS Code \n' +
  2. 'This is my second JS Code');
  • 效果如图:
    多行字符串

但是,现在可以利用模板字符串简化这个问题:

  1. console.log(`This is my first JS Code
  2. This is my second JS Code`);
  • 字符串中嵌入变量、表达式

首先,传统的JS表达式需要这样写:

  1. let num = 30;
  2. let price = 100;
  3. let res = '商品数量' + num + ', 单价:' + price + '元,总计:' + num * price;

使用上述传统的表达式写起来看着非常的乱,不直观,有时候还容易把连接符(+)写漏掉了,使用了ES6的模板字符串可以很好的避免这个问题:

  1. res = `商品数量:${num},单价:${price},总计:${num * price}`;
  2. console.log(res); // 商品数量:30,单价:100,总计:3000

以上结果都输出:

商品数量:30,单价:100,总计:3000

  • 标签函数

标签可以用函数来解析模板字符串。标签函数的第一个参数是一个包含了字符串值的数组,剩余的参数与表达式相关。

  1. let num = 10;
  2. let price = 99;
  3. function show(strings, var1, var2) {
  4. console.log(strings);
  5. console.log(var1, var2);
  6. }
  7. show `商品数量:${num}单价:${price}总计:${num * price}`;
  • 输出结果如图:
    标签函数

由上图可以看出,strings的值为一个字符串数组,va1,var2的值分别为num和price的值,由此结果可以很明显的看到,在使用标签函数时,模板字符串会被分割成多个部分,然后传入标签函数中进行处理,并且是以${expression}为分隔符进行分割的。从这个结论我们可以做一个总结:

  1. strings:以\${}为分隔符分割得到的字符串数组;
  2. var1:模板中第一个\${}的值;
  3. var2:模板中第二个\${}的值。
  4. 如果还有var3,var4,var5…等变量,那么就以此类推即可。

二、解构赋值

ES6中允许按照一定模式从数组和对象中提取值,然后再对变量进行赋值,这样的操作称为解构赋值。

在ES6以前,在变量赋值的时候只能为变量指定对应的值:

  1. let a = 1;
  2. let b = 2;
  3. let c = 3;

从ES6以后,允许用以下方式写:

  1. let [a, b, c] = [1, 2, 3];

以上代码的意思是从数组中取值,按照对应的位置给变量赋值,此时:

a = 1,b = 2,c = 3

从本质上来说,ES6的这种写法类似于“模式匹配”,所以,解构需要等号两边类型一致,左边的变量就会被赋予相对应的值。


2.1 数组的解构赋值

使用嵌套数组进行解构

  1. let [a, [[b], c]] = [1, [[2], 3]];

结果:

a = 1,b = 2,c = 3


  1. let [ , , third] = ["one", "two", "three"];

结果:

third的值为:”three”


  1. let [first, , third] = ["one", "two", "three"];

结果:

first = “one”, thrid = “three”


解构赋值允许指定默认值:

  1. let [x, y = '100'] = [10];

结果:

x = 10,y = 100

关于在指定默认值的时候有一个坑,具体请看下面代码:

  1. let [x = 1] = [undefined];
  2. console.log(x);
  1. let [x = 1] = [null];
  2. console.log(x);

上述两块代码x的值分别是多少呢?我当时没有在代码中测试,猜的结果都是1,但是在控制台试了一下,发现并不都是1,而是1和null,结果如图:

undefined

解构赋值允许指定默认值

这是为什么呢?通过查阅相关资料发现:

ES6内部使用的是严格相等运算符(===)来判断某个位置是否有值,所以,当一个数组变量中存在不严格等于undefined的值时,默认值是不生效的,怎么理解这句话呢?其实很好理解,我们在控制台测试一下null和undefined是否严格相等即可,例如:

undefined == null // true
undefined === null // false

  • 测试效果:
    undefined  null

2.2 对象的解构赋值

解构不仅可以用于数组,还可以用于对象。

现有如下对象:

  1. const user = {
  2. name: '残破的蛋蛋',
  3. age: 18,
  4. sex: '男',
  5. weight: 500
  6. };

现在我想单独把姓名和年龄两个对象属性拿出来并赋值,可以这样写:

  1. ({age, name} = {name: '残破的蛋蛋', age: 18});
  2. console.log(name, age); // 残破的蛋蛋 18

对象的解构与数组不同的是:数组的元素是按次序排列的,变量的值是由它的位置决定的,但是对象的属性没有固定的次序,但是变量名称必须与属性名称相同才能取到值。

  1. let {gender} = {name: '残破的蛋蛋', age: 18});
  2. console.log(gender); // undefined

上述代码中,由于左边的变量在右边没有对应的同名属性,导致无法正确的取到值,所以结果为undefined。
如果变量名与属性名不一致,必须按照如下格式写:

  1. ({sex: gender} = {name: '残破的蛋蛋', age: 18, sex: '男'});
  2. console.log(gender)

相当于是给sex起了一个别名gender。

2.3 字符串的解构赋值

字符串也是可以解构赋值的,因为在解构赋值种,字符串被转换成了一个类数组的对象。

  1. const [a, b, c, d, e] = 'Hello';
  2. console.log(a, b, c, d, e); // H e l l o

三、JavaScript流程控制方法

JavaScript流程控制可以简单的理解为:控制代码按照一定的结构顺序来执行,流程控制主要分为三种,分别是:顺序结构分支结构循环结构

3.1 顺序流程控制

顺序结构是程序中最简单、最基本的流程控制,程序会按照代码的先后顺序进行执行,程序中大部分的代码都是这样执行的。

3.2 分支结构

JavaScript提供了两种最常用的分支结构语句:if和switch语句。

3.2.1 if语句

  • 单分支语句(if)
  1. if(条件表达式) {
  2. // 条件成立需要执行的代码块
  3. }

案例:根据学生的成绩判断是及格、优秀、还是不及格需要补考:

学生成绩在60分以下需要补考,60-80之间为及格,80-100之间为优秀,成绩小于0或者大于100提示成绩分数非法!

  1. let score = 80;
  2. if (score >= 60) {
  3. console.log('及格了'); // 及格了
  4. }

  • 双分支语句 (if…else)
  1. if(条件表达式) {
  2. // 如果条件成立需要执行的代码块
  3. } else {
  4. // 否则执行该代码块
  5. }

  1. let score = 59;
  2. if (score >= 60) {
  3. console.log('及格了');
  4. } else {
  5. console.log('补考吧,兄弟');
  6. }
  7. // 补考吧,兄弟

  • 多分支语句(if…else if)
  1. if(条件表达式1) {
  2. // 代码块1
  3. } else if ((条件表达式2)) {
  4. // 代码块2
  5. } else if ((条件表达式3)) {
  6. // 代码块3
  7. } else {
  8. // 上述条件都不成立时,执行该代码块
  9. }

案例:

  1. let score = 90;
  2. if (score >= 60 && score < 80) {
  3. console.log('合格');
  4. } else if (score >= 81 && score <= 100) {
  5. console.log('学霸');
  6. } else if (score > 100 || score < 0) {
  7. console.log('非法分数');
  8. } else {
  9. console.log('补考吧,兄弟');
  10. }
  11. // 学霸

3.2.2 switch语句

switch根据不同的条件来执行不同的代码

  • 语法:
  1. switch(条件表达式) {
  2. case 条件1:
  3. // 条件表达式 === 条件1时执行的代码
  4. break;
  5. case 条件2:
  6. // 条件表达式 === 条件2时执行的代码
  7. break;
  8. case 条件3:
  9. // 条件表达式 === 条件3时执行的代码
  10. break;
  11. default:
  12. // 条件表达式 !== 以上任一条件时执行
  13. }

上述学生成绩的案例也可以使用switch语句来进行改写:

  1. let score = 90
  2. switch (true) {
  3. case score >= 60 && score < 80:
  4. console.log('合格'); break;
  5. case score >= 81 && score <= 100:
  6. console.log('学霸'); break
  7. // 判断成绩是否是一个有效的分数?
  8. case score > 100 || score < 0:
  9. console.log('非法分数'); break
  10. // 默认分支
  11. default: console.log('补考吧,兄弟');
  12. }
  • 结果:学霸

  • break 关键字

在JS代码中,break关键字是用来中断代码执行的,在switch…case语句中,如果找到了符合条件的语句,就会中断执行。因此,在使用switch语句时,千万不要忘记写break了。

  • default 关键字

如果给出的条件在case中都不满足,就运行default下的代码。

switch…case语句使用的是严格比较(===),意思是值必须与要匹配的类型相同。只有操作数属于同一类型时,严格比较才能为 true。

3.3 循环结构

3.3.1 for循环

  • 语法:
  1. for (语句 1; 语句 2; 语句 3) {
  2. // 执行的代码块
  3. }

其中,这三条语句的执行顺序分别为:

  • 语句1:在循环开始之前执行,相当于初始化;
  • 语句2:循环语句的条件;
  • 语句3:在循环执行之后再执行。

实例:

  1. // 定义一个数组
  2. const arr = [1, 2, 3, 4, 5];
  3. for (let i = 0; i < arr.length; i++) {
  4. document.write(arr[i]);
  5. }

结果:1 2 3 4 5

- 关于这三条语句的个人理解:

一般情况下,语句1是用来初始化循环中所用的变量的,比如上述实例中初始化了i = 0。但是语句1,并不是只能初始化一个值,也可以初始化多个值,用逗号分隔,比如:

  1. for (i = 0, len = arr.length; i < len; i++) {
  2. text += arr[i] + "<br>";
  3. }

而且,当在循环开始前,已经初始化过变量,那么语句1还能省略:

  1. let i = 0, len = arr.length;
  2. for (; i < len; i++) {
  3. document.write(arr[i]);
  4. }

语句2用于计算初始化中的条件,如果语句2返回的是true,那么循环继续,如果返回的是false,那么就结束循环。

语句3是将初始值递增/递减的,同时,语句3也可以省略:

  1. let i = 0, len = arr.length;
  2. for (; i < len;) {
  3. document.write(arr[i]);
  4. i++;
  5. }

3.3.2 for…in循环

在JavaScript中,for…in语句遍历对象属性:

  • 语法:
  1. for (变量 in 对象) {
  2. 在此执行代码
  3. }
  • 解释:

变量可以使数组元素,也可以是对象的属性

实例:声明一个用户的信息对象:

  1. const user = {
  2. name: '残破的蛋蛋',
  3. age: 18,
  4. sex: '男',
  5. weight: 500
  6. };

现在要求我们把用户的信息打印出来,使用for..in可以这样操作:

  1. for (let key in user) {
  2. console.log(`${key} => ${user[key]}`);
  3. }
  • 控制台打印的效果:

for/in

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:模板字面量是一个革命性的功能,极大的推动了前端的发展
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post