<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • 由‘==’和‘===’引出的js的隱式轉(zhuǎn)換問(wèn)題

          2018-6-1    周周

          ‘==’和‘===’都是Javascript中的比較運(yùn)算符,都是比較運(yùn)算符兩邊是否相等。對(duì)于‘==’和‘===’的區(qū)別,大家也都知道:

            ‘==’僅僅是比較運(yùn)算符兩邊的數(shù)值是否相等,如果數(shù)值相等則返回true;‘===’不僅會(huì)判斷運(yùn)算符兩邊的數(shù)值是否相等,并且還會(huì)判斷兩邊的類(lèi)型是否相等,只有數(shù)值和類(lèi)型都相等才會(huì)返回true。雖然知道以上的判斷依據(jù)已經(jīng)能解決絕大數(shù)此類(lèi)問(wèn)題,但是如果往其中深究來(lái)說(shuō),會(huì)有同學(xué)問(wèn):在比較的時(shí)候‘===’先判斷類(lèi)型,如果類(lèi)型不同就直接返回false,這個(gè)沒(méi)什么問(wèn)題。但是如果是‘==’比較兩個(gè)不同類(lèi)型的數(shù)據(jù)時(shí),具體是怎么進(jìn)行計(jì)算判斷的呢?

           既然是不同類(lèi)型進(jìn)行比較,肯定最終參與比較的結(jié)果必須是同一個(gè)類(lèi)型的,因此JS會(huì)存在一個(gè)隱式轉(zhuǎn)換的問(wèn)題,并且很多JS的隱式轉(zhuǎn)換很難通過(guò)console.log()等方法直觀的觀察到,因此很多初學(xué)者會(huì)對(duì)JS的隱式轉(zhuǎn)換感到疑惑。

           首先讓我們回憶一下,咱們的JS中一共有哪些數(shù)據(jù)類(lèi)型?

                 六大數(shù)據(jù)類(lèi)型
                 基本數(shù)據(jù)類(lèi)型(簡(jiǎn)單數(shù)據(jù)類(lèi)型)
                 number 數(shù)值型(NaN)
                 string 字符串
                 boolean 布爾型
                 undefined 未定義
                 null 空引用
                 引用數(shù)據(jù)類(lèi)型(復(fù)雜數(shù)據(jù)類(lèi)型)
                 object

                 JS基礎(chǔ)中,我們學(xué)習(xí)到咱們的JS中一共有六種數(shù)據(jù)類(lèi)型,分為基本數(shù)據(jù)類(lèi)型(簡(jiǎn)單數(shù)據(jù)類(lèi)型)和引用數(shù)據(jù)類(lèi)型(復(fù)雜數(shù)據(jù)類(lèi)型),不同類(lèi)型的值進(jìn)行比較的時(shí)候,存在隱式轉(zhuǎn)換的問(wèn)題,咱們通過(guò)‘==’來(lái)驗(yàn)證一下JS隱式轉(zhuǎn)換的情況。

                 1.我們首先來(lái)看看下列的語(yǔ)句計(jì)算結(jié)果:

          console.log(NaN==true);//false
          console.log(NaN==false);//false
          console.log(NaN==0);//false
          console.log(NaN==1);//false
          console.log(NaN==NaN);//false

                 由上面的例子可以看出,NaN屬于Number數(shù)據(jù)類(lèi)型中一個(gè)特殊情況,如果‘==’兩邊同為Number數(shù)據(jù)類(lèi)型的數(shù)字,很直觀的可以看出值是否相同一眼就可以看出結(jié)果,但是作為Number類(lèi)型的特殊情況,NaN在進(jìn)行比較的時(shí)候,也會(huì)有特殊的結(jié)果:如果 x 或 y 中有一個(gè)為 NaN,則返回 false;

                 2.我們繼續(xù)看看下列的語(yǔ)句計(jì)算結(jié)果:

          console.log(null == undefined); //true(特殊情況)---------------------------------
          console.log(null == ''); //false
          console.log(undefined == ''); //false

                在上述例子中,引出了一個(gè)null,null是一個(gè)簡(jiǎn)單數(shù)據(jù)類(lèi)型,它的意義就是一個(gè)空應(yīng)用,但是你如果通過(guò)console.log(typeof null) 來(lái)打印結(jié)果的時(shí)候卻發(fā)現(xiàn),結(jié)果竟然是object?此時(shí)你可能會(huì)懷疑人生,然后瘋狂的翻閱之前學(xué)習(xí)的資料,因?yàn)閛bject明明是一個(gè)復(fù)雜數(shù)據(jù)類(lèi)型,怎么會(huì)在判斷null這個(gè)簡(jiǎn)單數(shù)據(jù)類(lèi)型的類(lèi)型時(shí)打印出來(lái)呢?其實(shí),這個(gè)問(wèn)題屬于一個(gè)歷史問(wèn)題。咱們學(xué)習(xí)的JS在發(fā)展過(guò)程中是通過(guò)ECMAScript來(lái)確定規(guī)范的,每年都會(huì)有新的規(guī)定和規(guī)范提出,在JS的發(fā)展過(guò)程中,null一開(kāi)始的作用就是用來(lái)指向一個(gè)空地址,讓開(kāi)發(fā)者在創(chuàng)建數(shù)據(jù)的時(shí)候,先用null賦值給還未給值的對(duì)象用于標(biāo)準(zhǔn)初始化。但是其實(shí)咱們開(kāi)發(fā)過(guò)程中很少用到,但是這個(gè)仍作為規(guī)范留了下來(lái)。又因?yàn)閠ypeof是根據(jù)數(shù)據(jù)的前幾位判斷數(shù)據(jù)類(lèi)型的,null相當(dāng)于空指針,前幾位是地址的格式,所以判斷結(jié)果就為object。又因?yàn)閡ndefined值是派生自null值的,因此ECMA-262規(guī)定對(duì)他們的相等測(cè)試要返回true。所以這一情況判斷的條件為:如果 x 與 y 皆為 null 或 undefined 中的一種類(lèi)型,則返回 true(null == undefined // true);否則返回 false(null == 0 // false);

                 3.請(qǐng)看下列例子:

          console.log(true == '123'); //false
          console.log(true == '1'); //true
          console.log(false == '0'); //true
           
          console.log(true == !0); //true
           
          console.log([] == []); //false
          console.log([] == ![]); //true 比較地址 ------------------------------------------------
          var a = c = [];
          var b = [];
          console.log(a == b); //false
          console.log(a == !b); //true
          console.log(a == c); //true
           
          console.log(Boolean([]) == true); //true
          console.log(Number([]) == 0); //true
          console.log(Number(false) == 0); //true

                 其實(shí)比較的邏輯為:如果 x,y 類(lèi)型不一致,且 x,y 為 String、Number、Boolean 中的某一類(lèi)型,則將 x,y 使用 Number 函數(shù)轉(zhuǎn)化為 Number 類(lèi)型再進(jìn)行比較;

                使用Number函數(shù)可以將其他的數(shù)據(jù)類(lèi)型轉(zhuǎn)變?yōu)镹umber類(lèi)型,這一同為Number類(lèi)型的數(shù)據(jù),對(duì)比起來(lái)就會(huì)變得十分簡(jiǎn)單。值得注意的是在上述的例子中,兩個(gè)空數(shù)組進(jìn)行比較,結(jié)果返回的結(jié)果仍然為false,這個(gè)是怎么回事呢?其實(shí)這個(gè)很好理解,因?yàn)閿?shù)組也是對(duì)象的一種,是復(fù)雜數(shù)據(jù)類(lèi)型,所以用變量?jī)?chǔ)存對(duì)象時(shí)儲(chǔ)存的其實(shí)是地址。對(duì)象的內(nèi)容相同,但是儲(chǔ)存在堆區(qū)的位置不同,所以地址也是不同的,所以在判斷的時(shí)候返回的是false。

                其實(shí)在JS中還有很多的隱式轉(zhuǎn)換情況,以上只是針對(duì)于‘==’的隱式轉(zhuǎn)換情況,對(duì)于這些問(wèn)題,在實(shí)際開(kāi)發(fā)過(guò)程中,需要作為開(kāi)發(fā)者不斷的學(xué)習(xí)和積累,這也是咱們作為開(kāi)發(fā)者的一個(gè)要求之一。

          日歷

          鏈接

          個(gè)人資料

          存檔

          久久久无码精品亚洲日韩京东传媒| 亚洲国产成人久久综合一 | 亚洲一区精品伊人久久伊人| 亚洲va国产va天堂va久久| 久久中文精品无码中文字幕| 久久青草国产手机看片福利盒子| 午夜天堂av天堂久久久| 精品熟女少妇AV免费久久| 精品久久久无码人妻中文字幕| 色偷偷91久久综合噜噜噜噜| 久久久久亚洲爆乳少妇无| 久久av高潮av无码av喷吹| 久久久精品久久久久久| 久久精品国产99久久丝袜| 国产三级精品久久| 久久久久无码精品| 久久久久亚洲AV无码去区首| 亚洲国产成人久久一区久久| 色婷婷噜噜久久国产精品12p | 久久综合九色综合网站| 亚洲中文久久精品无码| www.久久热| 久久精品亚洲乱码伦伦中文| 亚洲?V乱码久久精品蜜桃| 亚洲精品无码久久久久去q| 久久婷婷五月综合国产尤物app| 国产91色综合久久免费| 久久精品成人一区二区三区| 久久这里的只有是精品23| 欧美大香线蕉线伊人久久| 国产精品va久久久久久久| 日韩欧美亚洲综合久久| 国产精品久久影院| 久久久久国产精品三级网 | 国产精品乱码久久久久久软件| 久久99国产综合精品免费| 国产精品伦理久久久久久 | 亚洲成色WWW久久网站| 国产欧美久久一区二区| 少妇久久久久久被弄到高潮| 久久婷婷五月综合色高清|