日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JS中捉摸不透的==(宽松等于)

發布時間:2023/12/2 javascript 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS中捉摸不透的==(宽松等于) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先來看一個有意思的面試題:

if(a == 3 && a == 4){//... }

第一眼看到這個面試題我是拒絕的,這個等式根本不會成立,怎么會存在一個值既等于3并且還同時等于4呢?根本不可能。

但是在神奇的javascript中這個a是存在的。(對javascript要永遠懷著一顆敬畏的心)

var i = 3; var a = new Object();a.valueOf = function(){return i++; }if(a == 3 && a == 4){console.log('等式成立了'); // 打印了 }

簡單一看這個面試題有點故弄玄虛,誰會這樣寫代碼?(我之前的想法)

但是這其中的知識點很有用,并且不是很好掌握。

其中的主要知識點就是寬松等于(==)涉及到的隱式類型轉換。在日常開發中總會被提醒盡量不要使用寬松等于,在相等比較時盡可能的使用嚴格等于。但是為什么呢?其實通過上面的面試題就可以看出來,寬松等于太神奇了(晦澀難懂,莫名其妙,坑太多),當然這是對于不太了解寬松等于類型轉換的我來說的。接下來則會不自量力的盡力來解釋一下類型轉換和寬松等于。

首先對于 == 和 === 的區別常被解釋為 == 并不檢查數據類型,=== 檢查數據類型。但是這個說法并不完全正確。相對正確的說法是 == 允許數據進行類型轉換而 === 并不允許。第一種說法貌似是 === 做了更多的事情,但事實卻不是這樣的。

== 的幾種情況分別是

  • 兩個值類型相同則比較值

    1.1 NaN不等于自身

    1.2 +0 等于 -0

    1.3 兩個對象指向同一個值則相等(不發生強制類型轉換)

    1.4 === 對于對象的比較同1.3

  • 數字和字符之間的比較

  • Boolean和其他之間的比較

  • 對象和非對象之間的比較

  • #數字和字符串之間的比較

    一個String類型值和一個Number類型值之間比較則將String類型值按照 轉換為Number表轉為Number類型。

    var a = '1'; var b = 1;console.log(a == b); // true 字符‘1’被轉換成了數字1再作比較則相等 console.log(a === b); // false 并沒有對字符'1'數據類型轉換,數據類型不同則不相等

    Boolean類型值和其他類型值之間的比較

    一個Boolean類型值和一個其他類型值之間比較則首先將Boolean類型值轉換為Number類型,true是1而false是0。

    var a = true;console.log(a == 1); // true轉換成了數字1再作比較則相等

    Object和其他類型值之間的比較

    一個Object類型值和一個其他類型值之間比較則將Object類型值按照如下步驟轉化:

  • 該對象如果有valueOf方法則調用該方法
  • 若該valueOf的返回值是基本類型則用作比較
  • 若valueOf的返回值不是基本類型則調用toString方法
  • 若toString方法返回基本類型值則用作比較
  • 若toString返回值不是基本類型則報錯
  • var a = {valueOf: function(){return 1;},toString: function(){return 2;} };console.log(a == 1); // true 調用a.valueOf獲得返回值再比較 var a = {valueOf: function(){return '1';},toString: function(){return 2;} };console.log(a == 1); // true

    以上代碼當對象a和數字1作比較調用valueOf方法獲得字符串‘1’,這時變成了字符串’1’和數字1作比較,根據字符串和數字比較的規則,將字符串轉換成數字等到數字1,然后兩個數字1作比較得出相等。

    當沒有valueOf方法或者valueOf方法不返回基本類型值的時候則調用toString方法。

    var a = {toString: function(){return 1} };console.log(a == 1); // true

    到這里開篇的那道面試題則不難理解了,寬松等于中對象和其他類型比較時涉及到了隱式強制類型轉換,首先會調用valueOf方法,如果有必要還會調用toString方法來獲取值來進行比較。

    Null和Undefined之間的比較

    在寬松等于比較中Null類型值只和自身還有Undefined類型值相等。

    console.log(null == undefined); // trueconsole.log(null == false); // falseconsole.log(undefined == false); // falseconsole.log(null == ''); // falseconsole.log(undefined == ''); // falseconsole.log(null == 0); // falseconsole.log(null == ''); // false

    幾個寬松等于的坑

    console.log(![] == []); // true // 取反的優先級高于 ==,所以![]轉為false,false轉為0,[]調用valueOf得到[],所以調用toString得到‘’,然后''轉為0,得到相等console.log(false == []); // true //false轉為 0,[]根據上面的步驟轉為0,得到相等"0" == false; // true 注意"0"并不是假值但是這里卻是相等的,因為 false 轉為 0,變成了數字和字符比較,字符串"0"轉為了數字0得到相等

    寬松等于中值a與Boolean作比較并不是比較值a是否為真或假,而是值a與轉換過后的Boolean值(0或1)作比較。

    參考

    你不知道的javascript(中卷)

    總結

    以上是生活随笔為你收集整理的JS中捉摸不透的==(宽松等于)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久日精品 | 国产亲伦免费视频播放 | 看毛片看毛片 | 性欧美丰满熟妇xxxx性仙踪林 | 亚洲一区精品在线 | 国产精品久久久久久久久晋中 | 欧美黄网站在线观看 | 中文av在线播放 | 久久免费精彩视频 | 伊人亚洲天堂 | 亚洲综合涩 | 天天天天射 | 日韩在线播放一区 | www.在线观看视频 | 欧美系列在线观看 | 日韩欧美一区二区三区在线 | 欧美大片免费看 | 中文精品无码中文字幕无码专区 | 亚洲一区在线播放 | 伊人网视频在线 | 日韩一级片免费观看 | 精品无码一区二区三区的天堂 | 久久99久久99精品免观看粉嫩 | 开心激情播播网 | 日韩大片免费 | 青青草原影视 | 在线观看日本一区二区 | 午夜久久久久久久 | 久久青娱乐 | 日本中文字幕有码 | 国产三级按摩推拿按摩 | 午夜少妇久久久久久久久 | 日本50路肥熟bbw | 91热热| 成人免费视屏 | 91麻豆精品国产91久久久无需广告 | jlzzzjlzzz国产免费观看 | 中文字幕在线第一页 | 欧美日韩国产成人精品 | 日韩免费av一区 | 精品久久久久成人码免费动漫 | 中文字幕在线观看亚洲 | 免费九九视频 | 91浏览器在线观看 | 白石茉莉奈黑人 | 欧美在线一级片 | 欧美视频黄色 | 高清一区二区在线 | 五月天亚洲色图 | 日韩不卡一二三区 | 清清草免费视频 | 黄色片在线播放 | 国产人人爽 | 免费视频毛片 | 欧美顶级少妇做爰 | 麻豆射区 | 国产老头户外野战xxxxx | 成人免费播放视频 | 久久一区二区三区四区五区 | 91精品成人 | 天天欧美 | 欧美精品一区二区蜜桃 | 国产一区二区三区视频网站 | 日批免费在线观看 | 99在线播放| 一区二区三区蜜桃 | 干欧美 | 日本一二三区不卡 | 91性生活| 久久精品视频久久 | 黄色在线播放 | 毛片内射 | 天天操夜夜干 | 久久伊人一区 | 天天操国产| 欧美三级韩国三级日本三斤 | 一级在线观看 | 波多野结衣一区二区三区高清av | 亚洲av无码国产精品麻豆天美 | 影视先锋av资源 | 亚洲成人av免费观看 | 91在线中文字幕 | 成人黄色在线观看 | 在线观看的黄色网址 | 中文不卡在线 | 日本夜夜操 | 一区二区三区视频在线 | 欧日韩不卡视频 | 制服中文字幕 | 草莓视频在线观看18 | 久久精品无码毛片 | 全部免费毛片在线播放一个 | 久久国产精品免费观看 | 国产资源网站 | 国产成人av影院 | 久久久久久久久久久97 | 欧美在线观看一区二区三区 | 六月激情综合 | 天堂色网|