核心内容
1、数据类型(简单数据类型)_2
1.1、数值类型(扩展)
1.1.1、目标
-
了解JS中的两个特殊的数值
-
了解NaN
-
熟练使用isNaN判断一个合法的数值
-
熟练使用length获取字符串的长度
-
熟练使用字符串转义符
1.1.2、两个特殊的值
有言在前:
数值型数据,可以有无数个。JS创始人为了让JS处理现实问题更严谨,所以又设计了两个特殊的值来表示特殊的情况。
-
Infinity
表示无穷大的情况,
+Infinity 正无穷大
-Infinity 负无穷大
示例:
console.log(1/0) // Infinity // Infinity既然是一个值也可以赋值给变量,但意义不大 let i = Infinity
- 1
- 2
- 3
- 4
运行 -
NaN(Not aNumber)
非数字,主要用于表示在进行数学运算时无法得到正确数值的情况下(人般是由于程序员的错误)。
示例:
// 数学运算时无法得到正确的数值数据 let a = 10; let b = '美女'; console.log(a * b) // NaN // NaN即是一个值,也可以尝试与其他数据进行运算,但结果都是NaN console.log(NaN + 1) console.log(NaN * 1) // NaN与任何值进行比较都不相等(包含自己) console.log(NaN == 0) //false console.log(NaN == 1) //false console.log(NaN == true) //false console.log(NaN == false) //false console.log(NaN == '') //false console.log(NaN == NaN) //false
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
运行送给迷茫的人:以上示例,没有任何实际意义,仅是告诉大家NaN的特点
1.1.3、JS中表示数值的能力
有言在前:
虽然现实中的我们可以写出天大的一个数字。
但是数据在内存中是占据存储存储空间的。JS为了能满足正常的编程需要,同时又不会过多的浪费内存,对数值的取值范围进行了合理的限制。
JS中所能表示的正数最大值为:1.7976931348623157e+308
负数最大值为:5e-324对于这么多位数的数字,记忆很难,所以JS将这两个值保存到两个地方:
Number.MAX_VALUE 正数最大值
Number.MIN_VALUE 负数最大值
需要时,我们直接调用即可获得JS所能表示的最大值与最小值
示例:
console.log(Number.MAX_VALUE) console.log(Number.MIN_VALUE)
'
- 1
- 2
运行
送给迷茫的人:Infinity用于表示的是一个无法描述的无穷大的数,而Number.MAX_VALUE指的是JS在数值表现方面的能力
1.1.4、isNaN
判断一个字符串不由纯数字组成。
注意:
不是由纯数字组成就返回true,由纯数字组成返回false。
示例:
let a = 'zhangsan' console.log(isNaN(a)) //true let b = '20' console.log(isNaN(b)) //false let c = '20.5' console.log(isNaN(c)) //false
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
运行
1.2、字符串类型(扩展)
1.2.1、字符串的长度
字符串是由多个字符组成的一个序列,字符串的长度就是字符串中字符的个数。
通过,字符串
.length 语法可以获取字符串的长度
示例:
let uname = 'zhangsan' console.log(uname.length) //8 let cn = '我是张三' console.log(cn.length) //4
'
- 1
- 2
- 3
- 4
- 5
运行
1.2.2、转义符( \ )
为什么要有转义符,看以下两个情况:
// 情况1:
// 字符串中即有单引号也有双引号
let str = '他让我告诉你,他说:"我喜欢你你你你...,我喜欢你离我远'一丁点'"' //报错
- 1
- 2
- 3
// 情况2:
// 我想输出abc
console.log('abc') // 所以括号里面要写所要输出的内容。
/* 我想输出带格式的 a换行b换行c
* a
* b
* c
*/
console.log('a
bc') // 报错(你想输出的换行会导致语法错误)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
转义符的作用
作用1:用于将被JS赋予给某些符号的特殊功能转义掉。
例如:
单引号、双引号 被js赋予了定义字符串的功能
’ 将当前单引号定义字符串的功能转义掉
" 将当前双引号定义字符串的功能转义掉作用2:赋予某些字符特殊的功能
例如:
\t 赋予制表符(tab键)的功能
\n 赋予换行的功能
\r 赋予回车的功能
对于\n \r都可以实现换行,推荐使用\n,因为\n在所有操作系统都支持
\r只有window支持
示例:
去取特殊字符的功能
let str1 = 'I\'m zhangsan' console.log(str1) // let str = '他让我告诉你,他说:"我喜欢你你你你...,我喜欢你离他远'一丁点'"' let str2 = "他说:\"他曾经追了你好久\"" console.log(str2) // 他说:"他曾经追了你好久"
'
- 1
- 2
- 3
- 4
- 5
运行
为字符赋予特殊的功能
let str1 = 'hello \nworld' console.log(str1) /* hello world */ let str2 = 'hello \tworld' console.log(str2) // hello world let str3 = 'my\\name\\is\\zhangsan' console.log(str3) // my\name\is\zhangsan
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
运行
没有任何功能的字符配合转义符,只会单纯输出这个字符(了解)
// 有些字符就是一个普通的字符,js没有赋予任何功能,前面加了转义符\,也没有任何意义,只会单纯的输出这个字符。 // 例如 h i j就是一个普通字符 let str = '\h\i\j' console.log(str) // hij
'
- 1
- 2
- 3
- 4
运行
1.2.3、模板字符串
模板字符串是一种新的定义字符串的方式。
作用:
模板字符串的作用就是用于解决字符串与变量拼接的问题。
定义:
在低版本的js中字符串只能使用单引号或双引号定义,但是在高版本的js中可以使用反引号定义字符串(``)
let str = `hello world` console.log(str) // hello world
'
- 1
- 2
运行
反引号在定义模板字符串时,可以换行定义(单引号或双引号定义字符串时是不可以的)
let str = `hello world` console.log(str) /* hello world*/
'
- 1
- 2
- 3
- 4
运行
字符串内解析变量值的语法:
${变量名}
let age = 20 let str = `我今天${age}岁了` // 使用反引号定义模板字符串 console.log(str)
'
- 1
- 2
- 3
运行
案例:
// 获取用户数据 let n1 = prompt('输入第1个数值') let n2 = prompt('输入第2个数值') // 对用户数据进行乘法运算,得到结果 let ret = n1 * n2 // 虽然得到了结果,但是最终显示的内容中不但有结果,还有其他内容(10 * 20 =)。这部分内容并不是完全由用户输入的 // 所以我们要拼接生成这部分内容, let fina = `${n1} * ${n2} = ${ret}` alert(fina)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
1.3、 应有所得
字符串长度 变量.length
转义符 \
去除某个字符的功能 ’ " \\
为某些字符添加功能 \n \t
模板字符串
定义 反引号
定义时可以换行
可以解析变量的值 ${变量名}
2、数据类型(复杂数据类型)
有言在前:
复杂数据类型在此仅作了解,后面章节会详细讲解。
在JS中数据类型分为两大类:简单数据类型、与复杂数据类型。
-
简单数据类型
数值
字符串
布尔
undefined
null
我们可以这么理解简单数据类型,之所以称之为简单是由于一个变量仅保存一个值(数据)。
-
复杂数据类型
array 数组
object 对象
function 函数
复杂数据类型主要复杂在值的个数上。复杂数据类型一个变量可以保存多个值(函数除外)
复杂数据类型的创建
array(数组)的创建
let arr = [‘zhangsan’,25,‘male’,90]
object(对象)的创建
let obj = {name:‘zhangsan’,age:25,sex:‘male’,score:90}
function(函数)的创建
function fn(){
// 函数体
}
示例:
let arr = ['zhangsan',25,'male',90] console.log(arr) // ["zhangsan", 25, "male", 90] let obj = {name:'zhangsan',age:25,sex:'male',score:90} console.log(obj) // {name: "zhangsan", age: 25, sex: "male", score: 90} function fn(){ console.log('runing...') // runing... } fn()
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
运行
3、数据类型转换
3.1、目标
- 将其他数据转换为数值Number()
- 将其他数据转换为字符串String()
- 将其他数据转换为布尔Boolean()
3.2、什么是数据类型转换
将一种数据类型转换为另外一种数据类型。
3.3、为什么要有数据类型转换
有言在前:
JS中只有相同数据类型才可以直接进行运算
示例:数据类型相同
let a = 10 let b = 20 let ret = a * b // 相同数据类型可以直接进行运算 console.log(ret) //200
'
- 1
- 2
- 3
- 4
运行
示例:数据类型不同
let x = 10 let y = '20' let ret1 = a * b console.log(ret) //200
- 1
- 2
- 3
- 4
❓ 人类有了疑问:不同数据类型不什么也可以进行计算呢???
???? JS回答到:
你以为我傻么~~~,我难道不会进行转换么。在进行运算时,如果遇到了不是同一种数据类型进行运算,我大名鼎鼎的JS会自作主张的将其转换为相同数据类型再进行运算。比如上面的运算,我会将字符串'20'转换为数值20再进行计算?
❓人类又有了疑问:
上面的代码你JS计算的很好,正是我想要的结果。但是你为什么不将数值10转换为'20'呢?你转换的依据是什么呢
????JS回答到:
你怎么这么傻,是你告诉的我要将两个数据进行 * 法运算呢~~~,*法运算是数值的运算,所以不是数值要转换为数值。
???? 人类说到:
(人类为了挽回自己的面子,盛赞了JS一番),高呼:前端威武,JS威武,JS对人类的想法了如执掌
???? JS听到这里突然打断说到:
先慢着,慢着...,别给我戴高帽,同时鄙视的看着人类,哼哼...。你们在为你的懒惰开脱么!!! 这都是你们写代码时偷懒才造就了我JS的伟大。你们在进行数据运算时,应用将数据强制转换为与运算符匹配的类型,这样运算才够准确。不过呢,如果每个数据都需要强制转换,也确实难为你们了。有我JS在就算你们不进行强制转换,绝大多数的时候我都可以理解你们的用意,帮你们转换了。但是呢,但可是呢,可但时呢,用你们人类的话讲:有一些锅不能推给我,有时必须由你们强制进行转换。你看下面的例子
// 业务场景:新商品入库 // 定义一个变量模拟商品原有的库存 let inventory = 100 // 新商品入库 let n = prompt('新购商品数量') // 得到的是字符串 '10' // 总数量 let sum = inventory + n; // 100 + '10' console.log(sum) //结果: 10010
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
???? 当人类执行完代码看到结果后,大吃一惊,JS说到,这个示例中的代码我自作主张的转换就没有得到你们想要的结果。同时抚摸着人类的头说到:你应该了解一下隐式转换与强制转换了。
3.4、数据类型的转换
数据类型的转换分为两种:隐式转换 与 强制转换
-
强制转换
程序员在写代码时对数据进行的强制转换
-
隐式转换
在代码执行时,由JS自作主张的进行的转换。
3.4.1、其他类型转数值
强制转换
语法:
Number(非数值数据)
示例:
let a = '10' let b = '' let c = true let d = false let e = undefined let f = null let g = 'a' console.log(Number(a)) // 10 console.log(Number(b)) // 0 console.log(Number(c)) // 1 console.log(Number(d)) // 0 console.log(Number(e)) // NaN console.log(Number(f)) // 0 console.log(Number(g)) // NaN
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
运行????能合理转换就进行转换,转换不了就转换为NaN(NaN设计的目标就是用于接收这种无法转换的情况)
隐式转换
- 算术运算符会触发隐式转换(除+、=+外,因为+与+=优先进行字符串拼接)
示例:
let a = '10' let b = '' let c = true let d = false let e = undefined let f = null let g = 'a' let ret_a = 100 * a // 变量a被隐式转换为 10 100 * 10 console.log(ret_a) // 1000 let ret_b = 100 * b // 变量b被隐式转换为 0 100 * 0 console.log(ret_b) // 0 let ret_c = 100 * c // 变量c被隐式转换为 1 100 * 1 console.log(ret_c) // 100 let ret_d = 100 * d // 变量d被隐式转换为 0 100 * 0 console.log(ret_d) // 0 let ret_e = 100 * e // 变量e被隐式转换为 NaN 100 * NaN console.log(ret_e) // NaN let ret_f = 100 * f // 变量f被隐式转换为 0 100 * 0 console.log(ret_f) // 0 let ret_g = 100 * g // 变量f被隐式转换为 NaN 100 * NaN console.log(ret_g) // NaN
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
运行
3.4.2、其他类型转换字符串
强制转换
语法1:
String(非字符串数据)
示例:
let a = 0; let b = NaN; let c = undefined; let d = null; let e = true; let f = false; console.log(String(a)) // '0' console.log(String(b)) // 'NaN' console.log(String(c)) // 'undefined' console.log(String(d)) // 'null' console.log(String(e)) // 'true' console.log(String(f)) // 'false'
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
运行语法2:
其他数据类型.toString()
示例:
let a = 0; let b = NaN; let c = true; let d = false; console.log(a.toString()) // '0' console.log(b.toString()) // 'NaN' console.log(c.toString()) // 'true' console.log(d.toString()) // 'false'
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
运行???? toString()方法不通用,null、undefined类型数据不支持。
隐式转换
- +、+=会触发字符串的隐式转换
示例:
let a = 0; let b = NaN; let c = undefined; let d = null; let e = true; let f = false; console.log(a + '10') // '010' console.log(b + '10') // 'NaN10' console.log(c + '10') // 'undefined10' console.log(d + '10') // 'null10' console.log(e + '10') // 'true10' console.log(f + '10') // 'false10'
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
运行???? 参与+、+=运算的两个数据中,只要有一个是字符串,另外一个数据就被隐式转换为字符串
3.4.3、其他数据类型转换为布尔
强制转换
语法:
Boolean(其他数据类型)
示例:
let a = 0; let b = 10; let c = ''; let d = '0'; let e = NaN; let f = null; let g = undefined; console.log(Boolean(a)) // false console.log(Boolean(b)) // true console.log(Boolean(c)) // false console.log(Boolean(d)) // true console.log(Boolean(e)) // false console.log(Boolean(f)) // false console.log(Boolean(g)) // false
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
运行???? 送给初学者:
只要不是真实存在的就转换为false
隐式转换
- 当一个数据作为条件表达式时,会触发隐式转换
示例:
let a = 0; let b = 10; let c = ''; let d = '0'; let e = NaN; let f = null; let g = undefined; if(a){ // false console.log('a') } if(b){ // true console.log('b') // b } if(c){ // false console.log('c') } if(d){ // true console.log('d') // d } if(e){ // false console.log('e') } if(f){ // false console.log('f') } if(g){ // false console.log('g') }
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
运行
3.4.4、提取数值
案例:
由用户输入商品单价,计算10个商品的总价钱
思路:
a.弹窗接收用户输入的单价
b.计算10个商品价格,并输出
设想代码:
let num = 10; // 商品数量 let price = prompt('输入单价:'); // 当用户输入的单价具有单位时 例如:'10元' let money = num * price; // '10元'会被隐式转换为 NaN alert(money) // 所以最终结果为 NaN
- 1
- 2
- 3
- 4
对于以上案例中的进行的数值转换时已无法满足需求,所以需要对字符串中的数值进行提取。从一个字符串中提取数值分两种:提取整数,提取小数
提取整数
语法:
parseInt(字符串)
说明:
在字符串中从左向右依次提取数字,直到遇到第1个非数字字符结束提取。
示例:
let a = '10yuan' console.log(parseInt(a)) // 10
'
- 1
- 2
运行
实现需求:
let num = 10; let price = prompt('输入单价:'); // 对字符串进行提取 price = parseInt(price) let money = num * price; alert(money)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
提取小数
语法:
parseFloat(字符串)
示例:
let a = '10.9yuan' console.log(parseInt(a)) // 10 console.log(parseFloat(a)) // 10.9
'
- 1
- 2
- 3
运行
实现需求:
let num = 10; let price = prompt('输入单价:'); // 输入 '10.9元' // 对字符串进行提取 price = parseFloat(price) // 10.9 let money = num * price; alert(money) // 109
- 1
- 2
- 3
- 4
- 5
- 6
- 7
????注意:parseInt、parseFloat如果是第1个字符是非数字就结束提取,并返回NaN
let a = 'rmb:10.9' console.log(parseInt(a)) // NaN console.log(parseFloat(a)) // NaN
'
- 1
- 2
- 3
运行
???? Number(字符串) 用于转换全是数字的字符串
???? parseInt(字符串)、parseFloat(字符串) 用于转换以数字开头的字符串
???? Number、parseInt、parseFloat在无法成功转换时会返回NaN
3.5、应有所得
4、运算符_2
4.1、自增、自减扩展
4.1.1、前自增 VS 后自增
- 前自增 与 后自增 对于变量本身值的变量没区别(都会将变量的值加1)
示例:
let a = 10; let b = 10; ++a; b++; console.log(a) // 11 console.log(b) // 11
'
- 1
- 2
- 3
- 4
- 5
- 6
运行
- 前自增 与 后自增 在参与其他运算时会让整个式子有不同的结果。
1.前自增 会先自增再参与其他运算
2.后自增 会先参与其他运算,再将变量的值自增
示例1:
let a = 10; let b = 10; // 整个式子的结果 let ret_a = ++a; let ret_b = b++; console.log(ret_a); // 11 console.log(ret_b); // 10 // 最终变量的结果 console.log(a) // 11 console.log(b) // 11
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
运行示例2:
let x = 10; let y = 10; let ret_x = 100 + ++x; let ret_y = 100 + y++; // 整个式子的结果 console.log(ret_x) // 111 console.log(ret_y) // 110 // 最终变量的结果 console.log(x) // 11 console.log(y) // 11
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
运行
4.1.2、前自减 VS 后自减
- 前自减 与 后自减 对于变量本身值的变量没区别(都会将变量的值减1)
示例:
let a = 10; let b = 10; --a; b--; console.log(a) // 9 console.log(b) // 9
'
- 1
- 2
- 3
- 4
- 5
- 6
运行
- 前自减 与 后自减 在参与其他运算时会让整个式子有不同的结果。
1.前自减 会先自减再参与其他运算
2.后自减 会先参与其他运算,再将变量的值自减
示例:
let a = 10; let b = 10; // 整个式子的结果 let ret_a = --a; let ret_b = b--; console.log(ret_a); // 9 console.log(ret_b); // 10 // 最终变量的结果 console.log(a) // 9 console.log(b) // 9
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
运行示例2:
let x = 10; let y = 10; let ret_x = 100 + --x; let ret_y = 100 + y--; // 整个式子的结果 console.log(ret_x) // 109 console.log(ret_y) // 110 // 最终变量的结果 console.log(x) // 9 console.log(y) // 9
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
运行
????自增、自减运算符只能与变量配合不能与字面值配合
4.2、比较运算符
4.2.1、数学中学习过的比较运算符
- >
- <
- >=
- <=
???? 以上运算符的比较规则与数学中的完全相同
4.2.2、其他比较运算符
有言在前:
与数据相关的有两方面:其一是值,其二是类型,以下运算符的比较涉及到值与类型
-
==
比较规则:
仅判断两个数据的值是否相同,相同则返回true,否则 返回false
示例:
var a = 10; var b = '10'; var c = 20; console.log(a == b) // true console.log(a == c) // false
- 1
- 2
- 3
- 4
- 5
- 6
运行 -
!=
比较规则:
仅判断两个数据的值是否不相同,不相同则返回true,否则返回false
示例:
let a = 10; let b = '20'; let c = 10; console.log(a != b) // true console.log(a != c) // false
- 1
- 2
- 3
- 4
- 5
运行 -
===
比较规则:
同时判断两个数据的值与类型完全相同,完全相同则返回true,有一方面不相同则返回false
示例:
let a = 10; let b = '10'; let c = 10; console.log(a === b) // false console.log(a === c) // true
- 1
- 2
- 3
- 4
- 5
运行 -
!==
比较规则:
判断两个数据的值与类型至少有一者不相同,至少有一者不相同则返回true,完全相同则返回false
示例:
let a = 10; let b = '10'; let c = 10; console.log(a !== b) // true console.log(a !== c) // false
- 1
- 2
- 3
- 4
- 5
运行
特别注意:其他数据与布尔值的比较
- true值比较
// 比较时会触发隐式转换 let a = 1; let b = '1'; let c = 2; // 非1数 console.log(true == a); // true console.log(true == b); // true console.log(true == c); // false
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
运行???? 人类有了疑问:布尔值与其他类型比较时,隐式转换是什么样的呢
???? JS回答到:所有的数据类型都要转换为数值再进行比较。如果是字符串与字符串的比较请移步至,
扩展
字符串的比较
处,我们单独聊聊。
- false值的比较
let a = ''; let b = '0'; console.log(false == a) // true console.log(false == b) // true
'
- 1
- 2
- 3
- 4
- 5
运行???? 人类拍手叫绝:受教了
???? JS鄙夷的望着人为:你还没有得到我的全部真传。想得到全部真传,请移步至,
扩展
特殊值的比较
???? 比较运算符的结果是一个布尔值
4.2.3、应有所得
4.3、逻辑运算符
????JS说:来来来,我们讨论一个你们人类的问题——找女朋友
条件1:是女的
条件2:大于等于18岁
这涉及两个条件,关系运算符一次只能表示1个条件,如果想对多个条件进行逻辑判断就需要使用逻辑运算符。所以逻辑运算符就是对多个条件进行逻辑运算的。主要用于表示多个条件的并且、或者、而且…之类的逻辑。
????JS又说:你们使用我JS来完成现实中这样的逻辑,那么我也要具有描述这样并且、或者… 逻辑的能力。为了表示这样的能力,我这里有几个逻辑运算符:&&、||、!
4.3.1、&&(逻辑与)
运算规则:
参与运算的两个操作数,只要有一个为false最终结果就为false。全部为true时,最终结果才为true
示例1:
console.log(true > false) // true console.log(true > true) // false console.log(false > true) // false console.log(false > false) // false
'
- 1
- 2
- 3
- 4
运行
示例2:
let a = 20; console.log( a > 18 && a < 25) // true /* 20 > 18 20 < 25 true && true true */
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
运行???? 全部为true,最终才为true
示例3:
let sex = prompt('请输入性别:女 或 男') let age = prompt('请输入年龄'); console.log(sex == '女' && age >= 18) // 性别为女,并且年龄大于等于18 if(sex == '女' && age >= 18){ alert('条件满足,可以交往') }else{ alert('条件不满足') }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
4.3.2、||(逻辑或)
运算规则:
参与运算的两个操作数只要有一个为true,最终结果就为true
示例1:
console.log(true || false) // true console.log(true || true) // true console.log(false || true) // true console.log(false || false) // false
'
- 1
- 2
- 3
- 4
运行
示例2:
let a = 20; console.log( a <= 30 || a >= 45) // true /* 20 > 18 20 < 25 true && false true */
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
运行???? 只要有一个为true,最终结果就为true
示例3:
// 相亲:要么有房,要么有车 let house = confirm('你有房么?') let car = confirm('你有车么?') // (house || car) if(house || car){ alert('条件满足,可以交往') }else{ alert('我妈不同意') }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
4.3.3、!(逻辑非)
运算规则:
只需要一个操作数,对操作数进行取反。
示例:
let a = true; let b = false; console.log(!a) // false console.log(!b) // true
'
- 1
- 2
- 3
- 4
- 5
运行
课堂提问:回答以下结果
let a = 5; let str = 'hello world'; console.log(a > 7 && str.length >=10 ) // false console.log(a < 7 && str.length >=10 ) // true console.log(a > 7 && str.length <10 ) // false console.log(a > 7 && str.length <10 ) // false
'
- 1
- 2
- 3
- 4
- 5
- 6
运行
5、流程控制_2
5.1、switch分支
JS中又提供了switch分支结构,也是用于分支判断。
语法:
switch(变量){
case 值1:
// 代码块1
break;
case 值2:
// 代码块2:
break
default:
// 缺省代码块
}
说明:
根据switch后的变量与case后的值的匹配情况,将程序转向相应的代码块执行
case结构可以有多个、break关键字可以省略、default结构可以省略
当某个代码块执行完毕后
如果遇到了break,则立即结束整个switch结构
如果没有遇到break,case会被穿透(不会判断紧随其后的值,继续执行其代码块)
注意:
后的变量与case后的值的比较属于 === 比较
后是冒号不是分号
示例1:基本示例
let a = 1; switch(a){ case 1: console.log('一名大乔'); break; case 2: console.log('二小乔'); break; case 3: console.log('三雨金枝'); break; case 4: console.log('四寸腰'); break; case 5: console.log('买市五六七色粉'); break; case 8: console.log('打扮八九十分娇'); break; default: console.log('我不会了') }
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
运行
示例2:缺少break
let a = 5; switch(a){ case 1: console.log('一名大乔'); break; case 2: console.log('二小乔'); break; case 3: console.log('三雨金枝'); break; case 4: console.log('四寸腰'); break; case 5: console.log('买市五六七色粉'); // break; // 注释掉break case 8: console.log('打扮八九十分娇'); break; default: console.log('我不会了') }
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
运行
5.2、合理的利用case穿透
当有多个值需要执行同一段代码时,多个case可以共用一个代码块。这种形式称之为case穿透
案例:用户输入一个数字,输出不同的季节
分析:
北半球的季节划分
3、4、5 春
6、7、8 夏
9、10、11 秋
12、1、2 冬
实现:
let month = Number(prompt('输入月份数')) switch(month){ case 3: case 4: case 5: console.log('春:春发') break; case 6: case 7: case 8: console.log('夏:夏长') break; case 9: case 10: case 11: console.log('秋:秋收') break; case 12: case 1: case 2: console.log('冬:冬藏') break; default: console.log('数据不合法') }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
扩展
全字符串的比较:
如果 两个数据都是字符串 那么在进行比较时,比较的是字符的unicode编码。
特殊值的比较
let a = NaN; let b = undefined; console.log(false == a) // false转换为0 a转换为NaN console.log(false == b) // false转换为0 b转换为NaN let c = null; console.log(c > 0) // false null被转换为0 所以0 > 0 不成立 console.log(c >= 0) // true null被转换为0 所以0 >= 0 成立 console.log(c == 0) // false null与0的比较根本不会转换 console.log(c == false) // false null与false的比较根本不会转换
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
运行???? JS说:我知道你们人类认为这个很难接受,但这个锅我不背。是JS设计者的错误,以下是我从网上截下的一段话
扩展
全字符串的比较:
如果 两个数据都是字符串 那么在进行比较时,比较的是字符的unicode编码。
特殊值的比较
let a = NaN; let b = undefined; console.log(false == a) // false转换为0 a转换为NaN console.log(false == b) // false转换为0 b转换为NaN let c = null; console.log(c > 0) // false null被转换为0 所以0 > 0 不成立 console.log(c >= 0) // true null被转换为0 所以0 >= 0 成立 console.log(c == 0) // false null与0的比较根本不会转换 console.log(c == false) // false null与false的比较根本不会转换
'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
运行???? JS说:我知道你们人类认为这个很难接受,但这个锅我不背。是JS设计者的错误,以下是我从网上截下的一段话