// 1、||(或)
// 返回第一个truthy真值
// - 从左到右依次处理每一个操作数,先将其转化为布尔值,转化结果为true,就停止计算并返回当前操作数的初始值
// - 如果所有操作数都计算过,并且转化结果全部为false,就返回最后一个操作数的初始值
// - 常见用法:
// - 获取变量或表达式中的第一个真值;
// - 短路求值:对操作数进行处理,直到遇到的一个真值,立即返回改值,且不再处理后续的操作数
// - (此特性可用来处理:左边条件为假时才需要执行某操作)
// 2、&&(与)
// 返回第一个falsey假值
// - 从左到右依次处理每一个操作数,先将其转化为布尔值,如果转化结果为false,就停止计算并返回当前操作数的初始值
// - 如果所有操作数都计算过,并且转化结果全部为true,就返回最后一个操作数的初始值
// 3、!(非)
// 返回相反的值
// - 先将操作数转化为布尔值
// - 再返回转化后的相反值
// 4、??(空值合并运算符)
// 返回第一个已定义(defined)的值
// - 已定义:不是null or undefined
// - 常见的使用场景:提供默认值(eg: 声明变量showTitle,存储后端返回的数据,需要在页面上展示出来,如果出现后端返回null/undefined的情况,就使展示‘未设置名称’:1、默认showTitle='未设置名称';2、showTitle??'noData')
// - 与||的区别:
// 1. ?? 返回第一个 defined 的值(返回第一个不是undefined,null)
// 2. || 返回第一个 truthy 真值(返回第一个不是0,false,undefined,null,'',"" 的值)
// console.log(false ?? 100) // false
// console.log(0 ?? 100) // 0
// console.log(false || 100) // 100
// 5、逻辑运算符注意:
// - 尽量不要使用 || 或者 && 来替代if,因为if的可读性更好
// - ?? 是js新特性,旧式浏览器需要polyfills处理兼容
// - 优先级:! && ||
// - ?? 的优先级跟||一样,处于安全原因,js禁止将??和&&和||一起使用,除非只要括号()明确指定了优先级
// console.log(1??2&&3) // 会报错
// console.log((1??2)&&3) // 结果:3
console.log(null || 2 || undefined) // 2
console.log(1 && null && 2) // null
const out = (n) => n
console.log(out(1) && out(2)) // 2
console.log(null || 2 && 3 || 4) //3
// ask: age 是否位于 14 到 90 的闭区间
const fn1 = (n) => {
let res = ''
if (n >= 14 && n <= 90) {
res = 'age 位于 14 到 90 的闭区间'
} else {
res = 'age 不在 14 到 90 的闭区间'
}
return res
}
console.log(fn1(20))
// ask: age 是否不位于 14 到 90 的闭区间
const fn2 = (n) => {
let res = 0
if (!(n <= 90 && n >= 14)) res = 1
if (n < 14 || n > 90) res = 1
return `age 是否不位于 14 到 90 的闭区间: ${['否', '是'][res]}`
}
console.log(fn2(20))
console.log(fn2(10))
// ask: 下面哪一个 console.log 将会被执行
// ask: if(...) 语句内表达式的结果是什么
if (-1 || 0) console.log('first'); // 执行 res=-1
if (-1 && 0) console.log('second'); // 不执行 res=0
if (null || -1 && 1) console.log('third'); // 执行 res=1
console.log(-1 || 0)
console.log(-1 && 0)
console.log(null || -1 && 1)
// ask: 实现使用 prompt 进行登录校验的代码
const loginTask = () => {
const userName = prompt('Entry your name of login:')
let password = ''
if (!userName) {
console.log('UserName Canceled')
return
}
const firstChar = userName.split(0, 1)
if (userName.slice(0, 1).toLocaleUpperCase() + userName.slice(1) === 'Admin') {
password = prompt('Entry your password of login:')
} else {
console.log('I don’t know you')
return
}
if (!password) return console.log('Password Canceled')
if (password === 'TheMaster') {
console.log('Welcome')
} else {
console.log('Wrong password')
}
}
// loginTask()
// 自增/自减运算,如果不使用运算结果的话,前置和后置都是对操作数进行加一/减一;如果需要用到其返回值的话,前置拿到增加/减少 后 的结果,后置拿到增加/减少 前 的结果