国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS中邏輯運(yùn)算符 && 的理解

caiyongji / 1830人閱讀

摘要:然而,和運(yùn)算符會(huì)返回一個(gè)指定操作數(shù)的值,因此,這些運(yùn)算符也用于非布爾值。例如返回值為返回值為返回值為除此之外的值,都會(huì)讓判斷繼續(xù)執(zhí)行,直到最后一個(gè)值。

JS中邏輯運(yùn)算符 && 的理解 從一個(gè)場景開始

我們試想這樣一個(gè)場景,有這樣一個(gè)對象,其數(shù)據(jù)結(jié)構(gòu)為:

const obj = {
    a: {
        b: {
            c: "i am c"        
        }
    }
}

要求是,寫一個(gè)函數(shù) printLast(value),將上述的對象的 obj.a.b.c 的值返回出來,否則,就返回 "nothing"
對于一個(gè)初學(xué)者,代碼可能是這樣的:

function printLast (obj) {
    if (obj != null) {
        if (obj.a != null) {
            if (obj.a.b != null) {
                if (obj.a.b.c != null) {
                    return obj.a.b.c
                }
            }
        }
    } else {
        return "nothing"
    }
}

還有一種不太嚴(yán)謹(jǐn)?shù)膶懛ǎ?/p>

function printLast (obj) {
    try {
        if (obj.a.b.c != null) {
            return obj.a.b.c
        } else {
            return "nothing"
        }
    } catch (error) {
        return "nothing"
    }     
}

對于稍有經(jīng)驗(yàn)的開發(fā)者,代碼可能是這樣的:

function printLast (obj) {
    if (obj != null && obj.a != null && obj.a.b !=null && obj.a.b.c != null) {
        return obj.a.b.c
    } else {
        return "nothing"
    }
}

或者

function printLast (obj) {
    if (obj && obj.a && obj.a.b && obj.a.b.c) {
        return obj.a.b.c
    } else {
        return "nothing"
    }
}

最后一種寫法才是比較成熟的,但是其作者不一定知道 && 的執(zhí)行邏輯。

步入正題

首先,我們回顧以下 && 的執(zhí)行邏輯。

&& 的執(zhí)行邏輯

官方的描述:

邏輯運(yùn)算符通常用于布爾型(邏輯)值。這種情況下,它們返回一個(gè)布爾值。然而,&& 和 || 運(yùn)算符會(huì)返回一個(gè)指定操作數(shù)的值,因此,這些運(yùn)算符也用于非布爾值。這時(shí),它們也就會(huì)返回一個(gè)非布爾型值。

大概的意思就是:&& 不僅可以用于布爾型的值,還可以用于非布爾值,并且返回的結(jié)果可以是任何類型的值,例如:

let bool = true && (3 === 4)  // 返回值為 true
let bool = true && "haha" // 返回值為"haha"
let bool = true && (() => { return "haha" }) // 返回值為一個(gè)匿名函數(shù): () => { return "haha" }

這樣的話,問題來了,什么樣的值才能讓 && 短路呢?

官方的描述,以下這些值能讓 && 判斷短路:

null;

NaN;

0;

空字符串("" or "" or ``);

undefined。

例如:

let bool = "haha" && 1 && null && true // 返回值為 null
let bool = "haha" && 1 && 0 && true // 返回值為 0
let bool = "haha" && 1 && "" && true // 返回值為 ""

除此之外的值,都會(huì)讓 && 判斷繼續(xù)執(zhí)行,直到最后一個(gè)值。

簡單使用

根據(jù)上述,我們?nèi)绾谓鉀Q一開始的問題呢?答案是: 很簡單,請看:

function printLast (obj) {
    let res = obj && obj.a && obj.a.b && obj.a.b.c // 如果obj.a.b.c存在返回其值,否則,返回undefined
    return !!res ? res : "nothing"http:// !! 和 if 一樣,能將各種類型的值轉(zhuǎn)化為布爾量
}

或者

function printLast (obj) {
    return (obj && obj.a && obj.a.b && obj.a.b.c) || "nothing" // 如果obj.a.b.c存在返回其值,否則,返回"nothing"
}

因?yàn)?&& 的執(zhí)行是短路的, 所以當(dāng)遇到undefined時(shí),就會(huì)停止判斷。
在這里,沒有討論js的邏輯運(yùn)算符 || ,原因是只要理解了 && 的執(zhí)行邏輯, || 的也就理解了,不是嗎?

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/105744.html

相關(guān)文章

  • 深入理解JS邏輯或(||)和邏輯與(&&)

    摘要:如果第一項(xiàng)的值為時(shí),則執(zhí)行后面一項(xiàng)的運(yùn)算,返回的是第二項(xiàng)執(zhí)行運(yùn)算后的值再來看多一個(gè)例子,自己多動(dòng)手嘗試看看就明白了。 先來看一個(gè)關(guān)于邏輯或的例子: var b = 0 var a = b++ || b++ console.log(b) // 2 var c = ++b || ++b console.log(a) // 1 console.log(c) //...

    sanyang 評(píng)論0 收藏0
  • ES2018 學(xué)習(xí)筆記(2)&& 和 || 運(yùn)算優(yōu)先級(jí)

    摘要:為什么比優(yōu)先級(jí)高起因偶然在網(wǎng)上搜索運(yùn)算符優(yōu)先級(jí),幾乎每個(gè)版本都告訴讀者比優(yōu)先級(jí)更高,包括這樣的權(quán)威網(wǎng)站也不例外。這與自己經(jīng)驗(yàn)不符它們應(yīng)該是優(yōu)先級(jí)一樣的。 為什么 && 比 || 優(yōu)先級(jí)高? 起因 偶然在網(wǎng)上搜索 js 運(yùn)算符優(yōu)先級(jí),幾乎每個(gè)版本都告訴讀者 && 比 || 優(yōu)先級(jí)更高,包括 MSN 這樣的權(quán)威網(wǎng)站也不例外。 MDN Operator_Precedence 這與自己經(jīng)驗(yàn)不符...

    james 評(píng)論0 收藏0
  • JS邏輯運(yùn)算符&&、||,位運(yùn)算符|,&

    摘要:中的符號(hào)運(yùn)算方法只要前面為不管后面是還是,都返回后面的值。舉個(gè)栗子位運(yùn)算符運(yùn)算方法兩個(gè)位只要有一個(gè)為,那么結(jié)果都為。否則就為繼續(xù)舉栗子運(yùn)算符還能進(jìn)行取整運(yùn)算位運(yùn)算符運(yùn)算方法兩個(gè)數(shù)值的個(gè)位分別相與,同時(shí)為才得,只要一個(gè)為就為。 1、JS中的||符號(hào): 運(yùn)算方法: 只要||前面為false,不管||后面是true還是false,都返回||后面的值。 只要||前面為true,不管||后...

    DDreach 評(píng)論0 收藏0
  • js|與 && 運(yùn)算符詳解

    摘要:這個(gè)時(shí)候我就有點(diǎn)犯迷糊了,為什么邏輯運(yùn)算符能這么用呢由于是出身,所以對這樣用感覺很奇怪。 這篇文章主要介紹了js中的 || 與 && 運(yùn)算符詳解,需要的朋友可以參考下 一 js中邏輯運(yùn)算符在開發(fā)中可以算是比較常見的運(yùn)算符了,主要有三種:邏輯與&&、邏輯或||和邏輯非!。 當(dāng)&&和|| 連接語句時(shí),兩邊的語句會(huì)轉(zhuǎn)化為布爾類型(Boolean),然后再進(jìn)行運(yùn)算,具體的運(yùn)算規(guī)則如下: 兩邊條...

    baoxl 評(píng)論0 收藏0
  • js|與 && 運(yùn)算符詳解

    摘要:這個(gè)時(shí)候我就有點(diǎn)犯迷糊了,為什么邏輯運(yùn)算符能這么用呢由于是出身,所以對這樣用感覺很奇怪。 這篇文章主要介紹了js中的 || 與 && 運(yùn)算符詳解,需要的朋友可以參考下 一 js中邏輯運(yùn)算符在開發(fā)中可以算是比較常見的運(yùn)算符了,主要有三種:邏輯與&&、邏輯或||和邏輯非!。 當(dāng)&&和|| 連接語句時(shí),兩邊的語句會(huì)轉(zhuǎn)化為布爾類型(Boolean),然后再進(jìn)行運(yùn)算,具體的運(yùn)算規(guī)則如下: 兩邊條...

    jsyzchen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

caiyongji

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<