js基础
# JavaScript 基础 - 第1天
> 了解变量、数据类型、运算符等基础概念,能够实现数据类型的转换,结合四则运算体会如何编程。
- JavaScript介绍
- 变量
- 常量
- 数据类型
- 运算符
- 实战案例
重点单词:
![image.png](https://cos.easydoc.net/84678576/files/lu9xuzzq.png)
## js介绍
>能说出JavaScript 是什么? 怎么写?
>
>能写出JavaScript 输入和输出语句
### js是什么?
#### 是什么?
是一种运行在客户端(浏览器)的编程语言,可以用来创建动态更新的内容,控制多媒体,制作图像动画等交互效果
### 怎么写?
JavaScript 程序不能独立运行,它需要被嵌入 HTML 中,然后浏览器才能执行 JavaScript 代码。通过 `script` 标签将 JavaScript 代码引入到 HTML 中,有两种方式:
#### 内部方式
通过 `script` 标签包裹 JavaScript 代码
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript 基础 - 引入方式</title>
</head>
<body>
<!-- 内联形式:通过 script 标签包裹 JavaScript 代码 -->
<script>
alert('嗨,欢迎来传智播学习前端技术!')
</script>
</body>
</html>
```
#### 外部形式
一般将 JavaScript 代码写在独立的以 .js 结尾的文件中,然后通过 `script` 标签的 `src` 属性引入
```javascript
// demo.js
document.write('嗨,欢迎来传智播学习前端技术!')
```
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript 基础 - 引入方式</title>
</head>
<body>
<!-- 外部形式:通过 script 的 src 属性引入独立的 .js 文件 -->
<script src="demo.js"></script>
</body>
</html>
```
如果 script 标签使用 src 属性引入了某 .js 文件,那么 标签的代码会被忽略!!!如下代码所示:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript 基础 - 引入方式</title>
</head>
<body>
<!-- 外部形式:通过 script 的 src 属性引入独立的 .js 文件 -->
<script src="demo.js">
// 此处的代码会被忽略掉!!!!
alert(666);
</script>
</body>
</html>
```
#### 注释和结束符
通过注释可以屏蔽代码被执行或者添加备注信息,JavaScript 支持两种形式注释语法:
#### 单行注释
使用 `// ` 注释单行代码
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript 基础 - 注释</title>
</head>
<body>
<script>
// 这种是单行注释的语法
// 一次只能注释一行
// 可以重复注释
document.write('嗨,欢迎来传智播学习前端技术!');
</script>
</body>
</html>
```
#### 多行注释
使用 `/* */` 注释多行代码
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript 基础 - 注释</title>
</head>
<body>
<script>
/* 这种的是多行注释的语法 */
/*
更常见的多行注释是这种写法
在些可以任意换行
多少行都可以
*/
document.write('嗨,欢迎来传智播学习前端技术!')
</script>
</body>
</html>
```
**注:编辑器中单行注释的快捷键为 `ctrl + /`**
#### 结束符
在 JavaScript 中 `;` 代表一段代码的结束,多数情况下可以省略 `;` 使用回车(enter)替代。
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript 基础 - 结束符</title>
</head>
<body>
<script>
alert(1);
alert(2);
alert(1)
alert(2)
</script>
</body>
</html>
```
实际开发中有许多人主张书写 JavaScript 代码时省略结束符 `;`
### 输入和输出语句
输出和输入也可理解为人和计算机的交互,用户通过键盘、鼠标等向计算机输入信息,计算机处理后再展示结果给用户,这便是一次输入和输出的过程。
#### 输出语句
~~~javascript
// 1. 输出语句
// 1.1 alert 页面弹出警示框
// alert('你好,js')
// 1.2 document.write 向页面文档输入内容 显示到页面body标签之内, 可以正常的解析标签
document.write('今日特价')
document.write('<h4>今日特价</h4>')
// 1.3 console.log 给我们程序员调试使用的 console 控制台
console.log('给咱们程序员使用的')
~~~
#### 输入语句
向 `prompt()` 输入任意内容会以弹窗形式出现在浏览器中,一般提示用户输入一些内容。
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript 基础 - 输入输出</title>
</head>
<body>
<script>
// 1. 输入的任意数字,都会以弹窗形式展示
document.write('要输出的内容')
alert('要输出的内容');
// 2. 以弹窗形式提示用户输入姓名,注意这里的文字使用英文的引号
prompt('请输入您的姓名:')
</script>
</body>
</html>
```
## 变量
### 变量是什么&基本使用
> 理解变量是计算机存储数据的“容器”,掌握变量的声明方式
变量是计算机中用来存储数据的“容器”,变量不是数据本身,它们仅仅是一个用于存储数值的容器。可以理解为是一个个用来装东西的纸箱子。
![image.png](https://cos.easydoc.net/84678576/files/lu9xuphd.png)
#### 声明
声明(定义)变量有两部分构成:声明关键字、变量名(标识)
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript 基础 - 声明和赋值</title>
</head>
<body>
<script>
// let 变量名
// 声明(定义)变量有两部分构成:声明关键字、变量名(标识)
// let 即关键字,所谓关键字是系统提供的专门用来声明(定义)变量的词语
// age 即变量的名称,也叫标识符
let age
</script>
</body>
</html>
```
关键字是 JavaScript 中内置的一些英文词汇(单词或缩写),它们代表某些特定的含义,如 `let` 的含义是声明变量的,看到 `let` 后就可想到这行代码的意思是在声明变量,如 `let age;`
`let` 和 `var` 都是 JavaScript 中的声明变量的关键字,推荐使用 `let` 声明变量!!!
#### 赋值
声明(定义)变量相当于创造了一个空的“容器”,通过赋值向这个容器中添加数据。
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript 基础 - 声明和赋值</title>
</head>
<body>
<script>
// 声明(定义)变量有两部分构成:声明关键字、变量名(标识)
// let 即关键字,所谓关键字是系统提供的专门用来声明(定义)变量的词语
// age 即变量的名称,也叫标识符
let age
// 赋值,将 18 这个数据存入了 age 这个“容器”中
age = 18
// 这样 age 的值就成了 18
document.write(age)
// 也可以声明和赋值同时进行
let str = 'hello world!'
alert(str);
</script>
</body>
</html>
```
#### 变量更新
变量赋值后,还可以通过简单地给它一个不同的值来更新它。
~~~javascript
// 1.更新变量
let age = 18
age = 19
// 注意: 不要多次声明同一个变量
// let age = 19
console.log(age)
~~~
#### 声明多个变量
**语法**:多个变量中间用逗号隔开。
**说明**:看上去代码长度更短,但并不推荐这样。为了更好的可读性,一般情况下我们一行只声明一个变量。
~~~javascript
// 2. 一次声明多个变量的简写方式 (了解 能认出来就可以了)
// let uname = 'pink老师', sex = '男'
let uname = 'pink老师'
let sex = '男'
console.log(uname, sex)
~~~
#### let 和 var 区别
在较旧的JavaScript,使用关键字 var 来声明变量 ,而不是 let
var 现在开发中一般不再使用它,只是我们可能再老版程序中看到它。
let 为了解决 var 的一些问题。
var 声明一些不合理的地方:
1. 可以先使用 在声明 (不合理)
2. var 声明过的变量可以重复声明(不合理)
3. 比如变量提升、全局变量、没有块级作用域等等
**结论:**
> var 就是个bug,别迷恋它了,以后声明变量我们统一使用 **let**
### 变量的本质
内存:计算机中存储数据的地方,相当于一个空间
变量本质:是程序在内存中申请的一块用来存放数据的小空间
![image.png](https://cos.easydoc.net/84678576/files/lu9xugh7.png)
### 变量名命名规则
关于变量的名称(标识符)需要遵守:
**规则:**
1. 只能是字母、数字、下划线、$,且不能能数字开头
2. 字母区分大小写,如 Age 和 age 是不同的变量
3. JavaScript 内部已占用于单词(关键字或保留字)不允许使用
4. 尽量保证变量具有一定的语义,见字知义
**规范:**
1. 起名要有意义
2. 遵守小驼峰命名法
1. 第一个单词首字母小写,后面每个单词首字母大写。例:userName
~~~javascript
// 1. 规则(法律)
// 1.1 变量名不能是关键字
// let let = 10
// 1.2 变量名的组成: 英文字母 数字 _ $ ,不能以数字开头
// let 1num = 10 错误
// let num! = 10 错误
// 1.3 js严格区分大小写
// let age = 18
// console.log(Age)
// 2. 规范(道德)
// 2.1 起名要有意义
// let age = 18
// let nl = 19
// 2.2 我们命名建议采取小驼峰命名法
let myName = 'pink老师'
let myFirstName = 'p'
~~~
## 常量
**是什么**:也是一个容器,用于保存数据的
**和变量的区别**: 常量里面保存的值是不允许改变的
**使用场景**:当某个值永远不会改变的时候,我们可以使用常量来保存,目的为了程序的安全
~~~javascript
// 常量: 也是一个容器用来保存的数据
const pi = 3.14
console.log(pi)
// 注意事项:
// 1. 常量里面的值是不允许修改的
pi = 3.141592653
console.log(pi)
// 2. 常量必须要初始化(声明常量的时候必须要赋值)
// const url
~~~
>注意: 常量不允许重新赋值,声明的时候必须赋值(初始化)
## 数据类型
> 计算机世界中的万事成物都是数据。
生活中会把物品进行归类,不同的物品不能混淆在一起。
计算机程序可以处理大量的数据,方便程序员的使用数据。
![image.png](https://cos.easydoc.net/84678576/files/lu9xu7qc.png)
### 数字型和字符串型
**数字型:**
即我们数学中学习到的数字,可以是整数、小数、正数、负数
通过` typeof `关键字检测数据类型
**字符串:**
被引号包裹的一段文字信息
JS中的字符串:
通过单引号( ‘’) 、双引号( “”)或反引号( `` ) 包裹的数据都属于字符串
单引号和双引号没有本质上的区别,推荐使用单引号。
>注意事项:
>
>1. 单引号/双引号可以互相嵌套,但是不以自已嵌套自已(口诀:外双内单,或者外单内双)
>2. 一定注意变量名不要加引号,否则认为是字符串
~~~javascript
// 1. 数字型: 用于计算的, js数字类型包含: 整数、小数
// let num1 = 18
// let num1 = -18
let num1 = 18.88
// let num1 = -18.88
console.log(typeof num1) // number typeof 关键字检测数据类型
// 2. 字符串类型: 被引号包裹的一段文字信息 单引号 双引号 反引号
let goods = '笔记本电脑'
let address = "黑马程序员"
console.log(typeof goods) // string
console.log(typeof address) // string
let color = `粉红色`
let tel = '13612342234'
// 2.1 变量是不能加引号的,变量加了引号就不是盒子了,是一个字符串
console.log('goods')
// 2.2 字符串嵌套的问题. 不能嵌套自己, 外单内双 或者 外双内单
console.log('今日特价"跳楼大甩卖"速速抢购')
console.log("今日特价'跳楼大甩卖'速速抢购")
~~~
### 模板字符串
**使用场景:**
拼接字符串和变量
**语法**
~~~javascript
// 1. 字符串拼接
let age = 91
// console.log('pink老师今年' + age + '岁')
console.log('pink老师今年' + age + '岁')
// 2. 模板字符串
console.log(`pink老师今年${age}岁`)
// 3. 模板字符串里面的字符串可以换行
~~~
> 注意:反引号中间的字符串可以换行的
### 布尔类型
表示肯定或否定时在计算机中对应的是布尔类型数据,它有两个固定的值 `true` 和 `false`,表示肯定的数据用 `true`,表示否定的数据用 `false`。
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript 基础 - 数据类型</title>
</head>
<body>
<script>
// pink老师帅不帅?回答 是 或 否
let isCool = true // 是的,摔死了!
isCool = false // 不,套马杆的汉子!
document.write(typeof isCool) // 结果为 boolean
</script>
</body>
</html>
```
### undefined
未定义是比较特殊的类型,只有一个值 undefined,只声明变量,不赋值的情况下,变量的默认值为 undefined,一般很少【直接】为某个变量赋值为 undefined。
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript 基础 - 数据类型</title>
</head>
<body>
<script>
// 只声明了变量,并末赋值
let tmp;
document.write(typeof tmp) // 结果为 undefined
</script>
</body>
</html>
```
**注:JavaScript 中变量的值决定了变量的数据类型。**
## 运算符
### 算术运算符
数字是用来计算的,比如:乘法 * 、除法 / 、加法 + 、减法 - 等等,所以经常和算术运算符一起。
算术运算符:也叫数学运算符,主要包括加、减、乘、除、取余(求模)等
| 运算符 | 作用 |
| ------ | ---------------------------------------------------- |
| + | 求和 |
| - | 求差 |
| * | 求积 |
| / | 求商 |
| **%** | 取模(取余数),开发中经常用于作为某个数字是否被整除 |
> 注意:在计算失败时,显示的结果是 NaN (not a number)
~~~javascript
// 算术运算符
console.log(1 + 2 * 3 / 2) // 4
let num = 10
console.log(num + 10) // 20
console.log(num + num) // 20
// 1. 取模(取余数) 使用场景: 用来判断某个数是否能够被整除
console.log(4 % 2) // 0
console.log(6 % 3) // 0
console.log(5 % 3) // 2
console.log(3 % 5) // 3
// 2. 注意事项 : 如果我们计算失败,则返回的结果是 NaN (not a number)
console.log('pink老师' - 2)
console.log('pink老师' * 2)
console.log('pink老师' + 2) // pink老师2
~~~
### 赋值运算符
赋值运算符:对变量进行赋值的运算符
= 将等号右边的值赋予给左边, 要求左边必须是一个容器
| 运算符 | 作用 |
| ------ | -------- |
| += | 加法赋值 |
| -+ | 减法赋值 |
| *= | 乘法赋值 |
| /= | 除法赋值 |
| %= | 取余赋值 |
~~~javascript
// 赋值运算符
let num = 1
// 1. 需求 我们想要num变量里面的值 + 1, 加完之后再把计算结果存到num里面
// num = num + 1
// console.log(num)
// 2. += 赋值运算符
num += 1 // 当前情况下是等价于 num = num + 1
console.log(num)
~~~
### 自增/自减运算符
| 符号 | 作用 | 说明 |
| ---- | ---- | -------------------------- |
| ++ | 自增 | 变量自身的值加1,例如: x++ |
| -- | 自减 | 变量自身的值减1,例如: x-- |
1. ++在前和++在后在单独使用时二者并没有差别,而且一般开发中我们都是独立使用
2. ++在后(后缀式)我们会使用更多
>注意:
>
>1. 只有变量能够使用自增和自减运算符
>2. ++、-- 可以在变量前面也可以在变量后面,比如: x++ 或者 ++x
~~~javascript
// 1. 自增运算符: 可以让变量里面的值加1
// let x = 3
// // x++ // x = x + 1 或者 x += 1
// ++x
// console.log(x)
// 2. ++在前和++在后的区别。 如果单独使用,没有区别,如果参与了运算就有区别
// 2.1 ++在前 前缀式 : 先对变量值+1, 然后拿着变量值做运算
// let x = 3
// let y = ++x
// console.log(y) // 4
// console.log(x) // 4
// 2.2 ++在后 后缀式 : 先拿着变量值运算,再对变量值+1
let x = 3
let y = x++
console.log(y) // 3
console.log(x) // 4
~~~
### 比较运算符
使用场景:比较两个数据大小、是否相等,根据比较结果返回一个布尔值(true / false)
| 运算符 | 作用 |
| ------ | -------------------------------------- |
| > | 左边是否大于右边 |
| < | 左边是否小于右边 |
| >= | 左边是否大于或等于右边 |
| <= | 左边是否小于或等于右边 |
| === | 左右两边是否`类型`和`值`都相等(重点) |
| == | 左右两边`值`是否相等 |
| != | 左右值不相等 |
| !== | 左右两边是否不全等 |
~~~javascript
// 比较运算符: 根据比较结果返回 布尔值 true / false
console.log(3 > 5) // false
console.log(3 < 5) // true
console.log(3 >= 5) // false
console.log(3 >= 3) // true
console.log(3 <= 5) // true
// console.log(3 = 3) // 错误
// 1. 判断是否相等我们使用 === 要求 值 和 数据类型都相等返回的结果才是true,提倡使用三等 全等
console.log(3 === 3) // true
console.log(3 === '3') // false
console.log(3 !== 3) // false
console.log(3 !== '3') // true
// 2. == 判断是否相等,使用较少, 判断值是否相等,并不判断数据类型是否相等
console.log(3 == 3) // true
console.log(3 == '3') // true
console.log(3 != 3) // false
~~~
### 逻辑运算符
使用场景:可以把多个布尔值放到一起运算,最终返回一个布尔值
| 符号 | 名称 | 日常读法 | 特点 | 口诀 |
| ---- | ------ | -------- | -------------------------- | -------------- |
| && | 逻辑与 | 并且 | 符号两边有一个假的结果为假 | 一假则假 |
| \|\| | 逻辑或 | 或者 | 符号两边有一个真的结果为真 | 一真则真 |
| ! | 逻辑非 | 取反 | true变false false变true | 真变假,假变真 |
| A | B | A && B | A \|\| B | !A |
| ----- | ----- | ------ | -------- | ----- |
| false | false | false | false | true |
| false | true | false | true | true |
| true | false | false | true | false |
| true | true | true | true | false |
~~~javascript
// 逻辑运算符: 逻辑与 && 逻辑或 || 逻辑非 !
// 1.逻辑与 && 一假则假
console.log(false && false) // false
console.log(false && true) // false
console.log(true && false) // false
console.log(true && true) // true
console.log(3 > 5 && 2 < 4) // false
// 判断某个数字是否在 8096到36999 之间: 数字大于等于 8096 并且小于等于36999
let num = 1000
console.log(num >= 8096 && num <= 36999) // false
console.log('------')
// 2. 逻辑或 || 一真则真
console.log(true || false) // true
console.log(false || true) // true
console.log(true || true) // true
console.log(false || false) // false
console.log('------')
// 3. 逻辑非 取反
console.log(!false) // true
console.log(!true) // false
~~~
### 运算符优先级
![image.png](https://cos.easydoc.net/84678576/files/lu9xttwv.png)
> 逻辑运算符优先级: !> && > ||
## 综合案例
![image.png](https://cos.easydoc.net/84678576/files/lu9xtp2m.png)
需求:用户输入商品价格和商品数量,以及收货地址,可以自动打印订单信息
分析:
①:输入数据
需要输入3个数据,所以需要3个变量来存储 价格 price、数量 num、地址 address
②:处理数据
需要计算总的价格保存变量:总计 total = price * num
③:输出数据
页面打印生成表格,里面填充数据,使用模板字符串
**完整代码:**
~~~html
<!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>综合案例-商品订单信息页面</title>
<style>
.title {
text-align: center;
color: #3e3e3e;
}
.order {
/* 合并相邻边框 */
border-collapse: collapse;
height: 80px;
margin: 0 auto;
text-align: center;
border-radius: 10px 10px 0 0;
overflow: hidden;
}
/* 给行添加渐变背景颜色 */
.order tr:nth-child(1) {
background-image: linear-gradient(to right, #f46e33, #f057a5);
}
.order tr:nth-child(2) {
background-image: linear-gradient(to right, #fdf0eb, #fdeff6);
}
.order tr:nth-child(2) :last-child {
color: #f282bb;
}
.order th {
padding: 5px 50px;
color: #fff;
}
.order,
th,
td {
border: 1px solid #fff;
line-height: 50px;
}
</style>
</head>
<body>
<h2 class="title">订单详情页面</h2>
<script>
// 1. 输入数据
let price = prompt('请你输入商品单价:')
let num = prompt('请您输入商品数量:')
let address = prompt('请您输入收货地址:')
// 2. 处理数据
let total = price * num // 计算总价
// alert(total)
// 3. 输出数据
document.write(`
<table class="order">
<tr>
<th>商品名称</th>
<th>商品价格</th>
<th>商品数量</th>
<th>总价</th>
<th>收货地址</th>
</tr>
<tr>
<td>小米青春版PLUS</td>
<td>${price}元</td>
<td>${num}</td>
<td>${total}元</td>
<td>${address}</td>
</tr>
</table>
`)
</script>
</body>
</html>
~~~
## 类型转换
类型转换:把一种数据类型转换成另外一种数据类型
**为什么需要类型转换呢?**
例如:使用表单、prompt 获取过来的数据默认是字符串类型的,此时就不能直接简单的进行加法运算
此时需要转换数据类型
数据类型转换可以分为: 显示转换和隐式转换
### 显示转换
自己手动写代码告诉系统该转成什么类型(数据类型明确、程序员主导)
#### 转换为数字型
1. Number(数据)
- 转换成功返回一个数字类型
- 转换失败则返回 NaN (例如数据里面包含非数字)
2. parseInt(数据)
- 只保留整数
- 如果数字开头的字符串,只保留整数数字 比如 12px 返回 12
3. parseFloat(数据)
- 可以保留小数
- 如果数字开头的字符串,可以保留小数 比如 12.5px 返回 12.5
~~~javascript
// 第一个数字
let num1 = prompt('请输入第一个月工资:')
// 第二个数字
let num2 = prompt('请输入第二个月工资:')
// 输出结果
alert(Number(num1) + Number(num2))
// 通过显示转换的方式把其他类型转换为数字型
// 1. Number() 最常用的一种方式 推荐
// 1.1 把字符串转换为数字型
console.log(typeof Number('1')) // 1 number
console.log(Number('abcd')) // NaN 如果无法完成转换则返回NaN
// 1.2 把布尔值转换为数字型 true false
console.log(Number(true)) // 1
console.log(Number(false)) // 0
// 1.3 把 null undefined 转换为数字型
console.log(Number(null)) // 0
console.log(Number(undefined)) // NaN
// 2. parseInt() 和 parseFloat() 固定使用场景的 100px 只要100 不要px
// 使用场景:把以数字开头的字符串,只保留数字这种情况下就可以使用
console.log(parseInt('100px')) // 100
console.log(parseInt('100.5px')) // 100 parseInt() 只保留整数
console.log(parseFloat('100.5px')) // 100.5 parseFloat() 可以返回小数
~~~
#### 转换为字符串和布尔型
![image.png](https://cos.easydoc.net/84678576/files/luaiki8o.png)
~~~javascript
// 1. 转换为字符串类型
// 1.1 String(数据) 开发中提倡使用这种方式
console.log(typeof String(1)) // '1' string
console.log(String(true)) // 'true' string
// 1.2 变量.toString(进制)
let num = 10
console.log(typeof num.toString()) // string
console.log(num.toString(10)) // string '10'
console.log(num.toString(8)) // string '12'
// 2. 转换为布尔型 Boolean (重点) 因为接下来我们要学习分支语句需要用到
// 2.1 有6种情况为false: false 0 '' null undefined NaN (无,没有)
// 2.2 其余的都为true
console.log(Boolean(false)) // false
console.log(Boolean(0)) // false
console.log(Boolean(1)) // true
console.log(Boolean('')) // false
console.log(Boolean(null)) // false
console.log(Boolean(undefined)) // false
console.log(Boolean(NaN)) // false
~~~
### 隐式转换
某些运算符被执行时,系统内部自动将数据类型进行转换,这种转换称为隐式转换。
![image.png](https://cos.easydoc.net/84678576/files/lu9y0xcb.png)
~~~javascript
// // 第一个数字
// let num1 = +prompt('请输入第一个月工资:')
// // 第二个数字
// let num2 = +prompt('请输入第二个月工资:')
// // 输出结果
// alert(num1 + num2)
// 1. 隐式转换为数字型的运算符
// 1.1 算术运算符 - * / 比较运算符 > ==
console.log(8 - '3') // 5
console.log('1999' * '2') // 3998
console.log(3 > '1') // true
console.log(3 == '3') // true
// 1.2 + 正号使用的时候,也会把字符串转换为 数字型
console.log('123') // '123'
console.log(+'123') // 123
console.log(typeof +'123') // number
// 2. 隐式转换为字符串型的运算符 + 拼接字符串 两侧只要有一个是字符串,结果就是字符串
console.log('pink' + 18)
console.log('' + 18) // '18'
// 3. 隐式转换为布尔型的运算符 !逻辑非
console.log(!true) // false
console.log(!0) // true
console.log(!'') // true
console.log(!null) // true
console.log(!undefined) // true
console.log(!NaN) // true
console.log(!false) // true
console.log(!'pink') // false
~~~
## 语句
### 表达式和语句
![image.png](https://cos.easydoc.net/84678576/files/lu9y0q8s.png)
### 分支语句
分支语句可以根据条件判定真假,来选择性的执行想要的代码
分支语句包含:
1. if分支语句(重点)
2. 三元运算符
3. switch语句
#### if 分支语句
语法:
~~~javascript
if(条件表达式) {
// 满足条件要执行的语句
}
~~~
小括号内的条件结果是布尔值,为 true 时,进入大括号里执行代码;为false,则不执行大括号里面代码
小括号内的结果若不是布尔类型时,会发生类型转换为布尔值,类似Boolean()
如果大括号只有一个语句,大括号可以省略,但是,俺们不提倡这么做~
~~~javascript
// if 分支语句 选择性的执行代码
// 1. 语法规范
// if (条件) {
// 满足条件要执行的代码
// }
// 2. 体验
// console.log('我想要被表扬')
// if (false) {
// console.log('我想要被表扬')
// }
// if (3 < 5) {
// console.log('我想要被表扬')
// }
if ('') { // 类型转换 类似于 Boolean()
console.log('我想要被表扬')
}
// 3. 需求: 用户输入高考成绩,如果分数大于等于700分,则提示 '恭喜考入黑马程序员'
let score = +prompt('请您输入高考成绩:')
if (score >= 700) {
alert('恭喜您考入黑马程序员')
}
~~~
#### if双分支语句
如果有两个条件的时候,可以使用 if else 双分支语句
~~~javascript
if (条件表达式){
// 满足条件要执行的语句
} else {
// 不满足条件要执行的语句
}
~~~
例如:
~~~javascript
// if 双分支语句
// 案例1: 考试成绩判断
// 1. 如果成绩大于等于700分,提示 '恭喜您,考入黑马程序员'
// 2. 否则则提示 '非常抱歉,你没有考入黑马程序员,明年再战!'
// let score = +prompt('请您输入考试成绩:')
// if (score >= 700) {
// alert('恭喜您,考入黑马程序员')
// } else {
// alert('非常抱歉,你没有考入黑马程序员,明年再战!')
// }
// 案例2: 用户登录案例
// 1. 如果用户名是刘德华并且密码是123456 则提示登录成功
// 2. 否则则提示登录失败
let uname = prompt('请您输入用户名:')
let pwd = prompt('请您输入密码:')
if (uname === '刘德华' && pwd === '123456') {
alert('登录成功,欢迎回来~')
} else {
alert('登录失败,您输入的用户名和密码错误~')
}
~~~
#### if 多分支语句
使用场景: 适合于有多个条件的时候
~~~javascript
// if 多分支语句
// 案例: 根据成绩输出评语
// (1).成绩90以上是 优秀
// (2).成绩70~90是 良好
// (3).成绩是60~70之间是 及格
// (4).成绩60分以下是 不及格
// 1. 用户输入成绩
let score = +prompt('请您输入考试成绩:')
// 2. 根据成绩判断输出不同的结果
if (score >= 90) {
alert('优秀,棒棒棒~')
} else if (score >= 70) {
alert('良好,棒棒~')
} else if (score >= 60) {
alert('及格,棒~')
} else {
alert('不及格,好好加油,你可以的~')
}
// 3. 注意事项
// 3.1 因为我们判断用的是大于等于,则里面的成绩要从大往小写
// 3.2 else if 可以有任意多个, else 不是必须的
~~~
#### 三元运算符(三元表达式)
**使用场景**: 一些简单的双分支,可以使用 三元运算符(三元表达式),写起来比 if else双分支 更简单
**符号**:? 与 : 配合使用
语法:
~~~javascript
条件 ? 表达式1 : 表达式2
~~~
例如:
~~~javascript
// 三元运算符(三元表达式)
// 1. 语法格式
// 条件 ? 表达式1 : 表达式2
// 2. 执行过程
// 2.1 如果条件为真,则执行表达式1
// 2.2 如果条件为假,则执行表达式2
// 3. 验证
// 5 > 3 ? '真的' : '假的'
console.log(5 < 3 ? '真的' : '假的')
// 4. 练习 求2个数字的最大值
// let x = 10
let x = 100
let y = 20
console.log(x > y ? x : y)
~~~
#### switch语句(了解)
使用场景: 适合于有多个条件的时候,也属于分支语句,大部分情况下和 if多分支语句 功能相同
注意:
1. switch case语句一般用于等值判断, if适合于区间判断
2. switchcase一般需要配合break关键字使用 没有break会造成case穿透
3. if 多分支语句开发要比switch更重要,使用也更多
例如:
~~~javascript
// switch分支语句
// 1. 语法
// switch (表达式) {
// case 值1:
// 代码1
// break
// case 值2:
// 代码2
// break
// ...
// default:
// 代码n
// }
// 2. 体验: 查询水果价格,输入水果,得到当前水果价格
let fruits = '苹果'
switch (fruits) {
case '香蕉':
alert('香蕉的价格是: 3元/斤')
break
case '苹果':
alert('苹果的价格是: 4元/斤')
break
case '橘子':
alert('橘子的价格是: 2元/斤')
break
default:
alert('没有查到此水果')
}
// 3. 注意事项
// 3.1 switch适合于等值判断, if多分支适合于区间判断
// 3.2 表达式的值要求 全等于 === case的值,才是能匹配上
// 3.3 break如果落下了,容易造成case穿透
~~~
#### 断点调试
**作用:**学习时可以帮助更好的理解代码运行,工作时可以更快找到bug
浏览器打开调试界面
1. 按F12打开开发者工具
2. 点到源代码一栏 ( sources )
3. 选择代码文件
**断点:**在某句代码上加的标记就叫断点,当程序执行到这句有标记的代码时会暂停下来
![image.png](https://cos.easydoc.net/84678576/files/lu9y0biz.png)