SOURCE

// 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()

// 自增/自减运算,如果不使用运算结果的话,前置和后置都是对操作数进行加一/减一;如果需要用到其返回值的话,前置拿到增加/减少 后 的结果,后置拿到增加/减少 前 的结果
console 命令行工具 X clear

                    
>
console