js实用技巧--短路求值

2,080 阅读2分钟

&运算符

如果操作有false 则返回false 例如 :

0&&1  // 返回0   

true&&false  //返回false

0&&null //返回0

如果所有操作数的值都是 true,将返回最后一个表达式的值。例如

let one = 1, two = 2, three = 3;

console.log(one && two && three); // Result: 3

| | 运算符

操作有true 就返回true 例如


true | | false  //返回true 

false | | true  //返回true  证明不是返回第一个表达式的值哦

如果所有操作数的值都是 false,将返回最后一个表达式的值。例如

0||false   //返回 false

false||0  //返回  0

看到这里 可能觉得太简单了吧 谁不会。。。 不过可能工作中确实不知道怎么用吧 下面说几个示例:

1.假设我们想要返回一个变量的 length,但又不知道变量的类型 应该怎么搞呢?

我们可以使用 if/else 来检查 foo 是否是一个可接受的类型,但这样会让代码变得很长。这个时候可以使用短路求值:

return (foo | | [ ] ).length  

上述代码 如果有length 就返回长度 否则 就返回0

let arr;

(arr | | [ ]).length

//返回 0
arr = [1,2,3,4]

(4) [1, 2, 3, 4]

( arr | | [ ] ).length

//返回4

2.你是否曾经在访问嵌套对象属性时遇到过问题?你可能不知道对象或某个子属性是否存在,所以经常会碰到让你头疼的错误。

假设我们想要访问 this.state 中的一个叫作 data 的属性,但 data 却是 undefined 的。在某些情况下调用 this.state.data 会导致 App 无法运行。为了解决这个问题,我们可以使用条件语句:


if (this.state.data){

    return this.state.data;

}else {

    return 'Fetching Data';

}

如果使用短路求值 是不是更加简洁一点呢

return ( this.state.data | |  'Fetching Data' )

3.[0, null, '', 123,46546,54]将数组的0 null ‘’都转化为666

// [0, null, '', 123,46546,54]将数组的0 null ‘’都转化为666
        常规操作
        let arr = [0, null, '', 123,46546,54]
        let newArr = []
        arr.forEach((item,index)=> {
            /* if(!item){
                newArr[index] = '666'
            }else{
                newArr.push(item)
            } */
            // 短路求值
            newArr.push(item || (item = '666'))
        })
        console.log(newArr)