最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中三個(gè)等號(hào)和兩個(gè)等號(hào)你了解多少

 更新時(shí)間:2017年07月04日 14:45:36   作者:Jessica  
本篇文章主要介紹了js里面的==和===,== 判斷如果兩邊變量的類型不同,而 === 則不做類型轉(zhuǎn)換,有興趣的可以了解一下

引子

眾所周知,用在if條件判斷語(yǔ)句中,js有六種假值:false, null, undefined, '', NAN, 0。先來看幾個(gè)例子:

[] === []
NaN === NaN
NaN == NaN
0 == []
'' == []
'' == {}
[] == undefined
{} == []
null == undefined

以上這些判斷結(jié)果是什么,大家能否一看就知道結(jié)果呢?筆者以前對(duì)==和===都只有大概的印象,相信大家也都知道,== 判斷如果兩邊變量的類型不同,會(huì)將其先做類型轉(zhuǎn)換再作判斷,而 === 則不做類型轉(zhuǎn)換,如果類型不同,就一定返回 false。但是筆者最近看到了一個(gè)題目,感覺很有意思,貼出來給大家看看:

var x = 1;
var obj = {
  valueOf: function(){ 
    x = 2; 
    return 0 
    }
  }
console.log(obj == 0, x)

恩,這段代碼輸出的結(jié)果是 true, 2,是不是不可思議?還有~

var x = 1;
var obj = {
  valueOf: function(){ 
    return {} 
  }, 
  toString: function(){ 
    return {}
  }
 }
 console.log(obj == 0)

這段代碼直接拋出了異常: Uncaught TypeError: Cannot convert object to primitive value。

如果你和我一樣覺得很奇怪,那就繼續(xù)往下看吧~

=== 的規(guī)則

這個(gè)比較簡(jiǎn)單,我把規(guī)則羅列一下

  1. 如果類型不同,就不相等
  2. 如果兩個(gè)都是數(shù)值,并且是同一個(gè)值,那么相等,例外的是,如果其中至少一個(gè)是NaN,那么不相等。(判斷一個(gè)值是否是 NaN,只能用isNaN() 來判斷)
  3. 如果兩個(gè)都是字符串,每個(gè)位置的字符都一樣,那么相等;否則不相等。
  4. 如果兩個(gè)值都是true,或者都是false,那么相等。
  5. 如果兩個(gè)值都引用同一個(gè)對(duì)象或函數(shù),那么相等;否則不相等。
  6. 如果兩個(gè)值都是null,或者都是undefined,那么相等。

這里不難發(fā)現(xiàn),復(fù)合類型的數(shù)據(jù)(比如對(duì)象、數(shù)組、函數(shù)等)之間的比較不是比較他們的值是否相等,而是比較他們引用的對(duì)象是否一樣,因此也不難明白,為什么 [] === [] 判斷為false了。

比如:

== 探究

看下 == 的規(guī)則

  1. 如果兩個(gè)值類型相同,進(jìn)行 === 比較。
  2. 如果兩個(gè)值類型不同,他們可能相等。根據(jù)下面規(guī)則進(jìn)行類型轉(zhuǎn)換再比較:
  3. 如果一個(gè)是null、一個(gè)是undefined,那么相等。
  4. 如果一個(gè)是字符串,一個(gè)是數(shù)值,把字符串轉(zhuǎn)換成數(shù)值再進(jìn)行比較。
  5. 如果任一值是 true,把它轉(zhuǎn)換成 1 再比較;如果任一值是 false,把它轉(zhuǎn)換成 0 再比較。
  6. 如果一個(gè)是對(duì)象,另一個(gè)是數(shù)值或字符串,把對(duì)象轉(zhuǎn)換成基礎(chǔ)類型的值再比較。對(duì)象轉(zhuǎn)換成基礎(chǔ)類型,利用它的toString或者valueOf方法。 js核心內(nèi)置類,會(huì)嘗試valueOf先于toString。例外的是Date,Date利用的是toString轉(zhuǎn)換。非js核心的對(duì)象,會(huì)比較麻煩,有興趣的同學(xué)可以研究一下
  7. 任何其他組合,都不相等。

看到這里,第六條,我們就可以明白,為什么上面的代碼會(huì)輸出意想不到的結(jié)果甚至拋出錯(cuò)誤了。

再來看一題:

if (x == 10) 
  x += 5

根據(jù)上面的規(guī)則,試想一下,如果我們輸入的x是字符串20,那么x的結(jié)果會(huì)變成什么樣?沒錯(cuò),就是205,而往往這種情況我們的目的是想計(jì)算20+5的值。

綜合上面的例子,不難看出,== 的比較看似會(huì)比較方便,比如 1 == '1' ,但是會(huì)埋下隱患,比如可能對(duì)類型做出錯(cuò)誤的假設(shè)。因此大多數(shù)人建議我們少用== 而盡量使用 ===,事實(shí)上我也推薦如果明確知道類型,還是最好用===。

再舉個(gè)簡(jiǎn)單的例子:團(tuán)隊(duì)協(xié)作中你肯定需要讀別人的代碼。而當(dāng)你看到==時(shí),要判斷清楚作者的代碼意圖是確實(shí)需要轉(zhuǎn)型,還是無所謂要不要轉(zhuǎn)型只是隨手寫了,還是不應(yīng)該轉(zhuǎn)型但是寫錯(cuò)了……所花費(fèi)的腦力和時(shí)間比明確的===(加上可能需要的明確轉(zhuǎn)型)要多得多。這樣一想,===不要好太多。

明白了==的機(jī)制,那么判斷這6個(gè)假值,就變得容易了。

簡(jiǎn)單看看幾個(gè)例子,大家看看是真是假~

false == ''
false == []
0 == []
'' == []
[] == []
[] == {}
null == undefined
false == undefined

總結(jié)

可以用一張圖來表達(dá) == 返回true的幾個(gè)假值:

一、首先看雙等號(hào)前后有沒有NaN,如果存在NaN,一律返回false。

二、再看雙等號(hào)前后有沒有布爾,有布爾就將布爾轉(zhuǎn)換為數(shù)字。(false是0,true是1)

三、接著看雙等號(hào)前后有沒有字符串, 有三種情況:

  1. 對(duì)方是對(duì)象,對(duì)象使用toString()或者valueOf()進(jìn)行轉(zhuǎn)換;
  2. 對(duì)方是數(shù)字,字符串轉(zhuǎn)數(shù)字;
  3. 對(duì)方是字符串,直接比較;
  4. 其他返回false
  5. 如果是數(shù)字,對(duì)方是對(duì)象,對(duì)象取valueOf()或者toString()進(jìn)行比較, 其他一律返回false
  6. null, undefined不會(huì)進(jìn)行類型轉(zhuǎn)換, 但它們倆相等

后記

我的建議是:如果你的的確確知道你在做什么(了解類型轉(zhuǎn)換的結(jié)果),可以用==;否則還是用===吧。

在網(wǎng)上無意中看到的圖,大家可以參考看看:

==號(hào)

===號(hào)


以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用JavaScript遍歷輸出頁(yè)面中的所有元素的方法詳解

    使用JavaScript遍歷輸出頁(yè)面中的所有元素的方法詳解

    在前端開發(fā)中,遍歷頁(yè)面中的所有元素是一個(gè)常見需求,無論是調(diào)試、頁(yè)面分析,還是獲取元素信息,都會(huì)用到遍歷 DOM 樹的操作,本文將介紹如何通過 JavaScript 編寫一個(gè)方法,遍歷并輸出頁(yè)面中的所有元素,需要的朋友可以參考下
    2024-12-12
  • javascript如何寫熱點(diǎn)圖

    javascript如何寫熱點(diǎn)圖

    這篇文章主要介紹了javascript如何寫熱點(diǎn)圖,熱點(diǎn)圖是以點(diǎn)的形式展示,通過補(bǔ)全周邊變化顏色也會(huì)相應(yīng)的調(diào)整漸變,對(duì)熱點(diǎn)圖感興趣的朋友可以參考一下
    2015-12-12
  • JS實(shí)現(xiàn)倒序輸出的幾種常用方法示例

    JS實(shí)現(xiàn)倒序輸出的幾種常用方法示例

    這篇文章主要介紹了JS實(shí)現(xiàn)倒序輸出的幾種常用方法,結(jié)合實(shí)例形式分析了JavaScript字符串與數(shù)組的轉(zhuǎn)換、變量、分割、反轉(zhuǎn)等相關(guān)操作技巧,需要的朋友可以參考下
    2019-04-04
  • 微信js-sdk地理位置接口用法示例

    微信js-sdk地理位置接口用法示例

    這篇文章主要介紹了微信js-sdk地理位置接口用法,結(jié)合實(shí)例形式分析了js-sdk地理位置接口的定義與簡(jiǎn)單使用方法,需要的朋友可以參考下
    2016-10-10
  • js+css實(shí)現(xiàn)的仿office2003界面

    js+css實(shí)現(xiàn)的仿office2003界面

    js+css實(shí)現(xiàn)的仿office2003界面...
    2007-03-03
  • JavaScript實(shí)現(xiàn)倒計(jì)時(shí)跳轉(zhuǎn)頁(yè)面功能【實(shí)用】

    JavaScript實(shí)現(xiàn)倒計(jì)時(shí)跳轉(zhuǎn)頁(yè)面功能【實(shí)用】

    本文分享了JavaScript實(shí)現(xiàn)倒計(jì)時(shí)跳轉(zhuǎn)頁(yè)面功能的具體實(shí)例代碼,頁(yè)面代碼簡(jiǎn)單,直接拷貝就能運(yùn)行,頁(yè)面可以自己美化下哦。需要的朋友一起來看下吧
    2016-12-12
  • 微信小程序 select 下拉框組件功能

    微信小程序 select 下拉框組件功能

    這篇文章主要介紹了微信小程序 select 下拉框組件功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 給easyui的datebox控件添加清空按鈕的實(shí)現(xiàn)方法

    給easyui的datebox控件添加清空按鈕的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄oeasyui的datebox控件添加清空按鈕的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • bootstrap與pagehelper實(shí)現(xiàn)分頁(yè)效果

    bootstrap與pagehelper實(shí)現(xiàn)分頁(yè)效果

    這篇文章主要為大家詳細(xì)介紹了bootstrap與pagehelper實(shí)現(xiàn)分頁(yè)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • js文件包含的幾種方式介紹

    js文件包含的幾種方式介紹

    這篇文章主要介紹了js文件包含的幾種方式,在某些情況下還是比較實(shí)用的,下面以示例代碼的方式來呈現(xiàn)
    2014-09-09

最新評(píng)論

年辖:市辖区| 蒙阴县| 岐山县| 三亚市| 青铜峡市| 长宁区| 沁阳市| 建阳市| 根河市| 托克逊县| 鲁山县| 连城县| 邵阳市| 西林县| 丁青县| 资兴市| 治多县| 湖南省| 司法| 安丘市| 手游| 大港区| 沂水县| 广灵县| 成武县| 冀州市| 淮阳县| 育儿| 天峨县| 涟水县| 韩城市| 永和县| 新和县| 卓尼县| 沅陵县| 清水县| 本溪市| 公主岭市| 和硕县| 吉林省| 新乡县|