轻分享&&和||

246 阅读2分钟

学过计算机语言的对逻辑运算符(选择器运算符) || (或)和 && (与)并不陌生,但是在JavaScript中,与其他语言有一些差别,在 JavaScript 中它们返回的并不是布尔值。 它们的返回值是两个操作数中的一个(且仅一个)。即选择两个操作数中的一个,然后返回它的值。

let a = '123',
    b = 'abc',
    c = null;

console.log(a && b) // 'abc'
console.log(c && b) // null
console.log(a && c) // null
console.log(a || b) // '123'
console.log(c || b) // 'abc'
console.log(a || c) // '123'

|| 和 && 首先会对第一个操作数(例子中是a和c)做判断,如果不是布尔值,就会进行强制类型转换,然后再执行条件判断。

对 || 来说,如果条件判断结果为true,则返回第一个操作数,如果为false就返回第二个操作数;

对 && 则刚好相反,如果结果为true,则返回第二个操作数,如果为false就返回第一个操作数。

也就是说,返回哪个结果只与第一个操作数和逻辑运算符相关。

在ES6默认参数出现前,我们可以这么写:

function sum(a, b){
  a = a || 1
  b = b || 2
  console.log(a+b)
}

sum() // 3
sum(3) // 5
sum(3,3) // 6
sum(3, '') // 5   这里b为''是假值,所以返回2,那么b=2

还有一种用法是“短路”

function a(){
  console.log('a called')
  return false
}

function b() {
  console.log('b called')
  return true
}

a() && b(); // "a called"

b() && a(); // "b called" "a called"

逻辑表达式的运算顺序是从左到右,这里是否执行第二个函数,取决于第一个函数的结果。

相对于我们常用的if(){},这样写代码量更少,但是可阅读性比较差,一般交给代码压缩工具处理。