亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

javascript中的相等操作符(==與===區(qū)別)

 更新時間:2019年12月21日 14:24:30   投稿:mdxy-dxy  
這篇文章主要介紹了javascript中的相等操作符(==與===區(qū)別),需要的朋友可以參考下

1.前言

我們在編程的過程中,經(jīng)常會遇到判斷兩個變量是否相等的情況,ECMAscript提供了兩種相等操作符”==”和”===”來判斷,這兩種操作都會返回一個boolean值。一般來說,我們把”==”稱之為相等,稱”===”為全等。當兩相比較的兩個變量數(shù)據(jù)類型一致時,情況比較簡單,而當操作符兩邊的變量類型不一致,甚至其中的某個變量是對象時,情況就比較復(fù)雜了,下面分別介紹當操作數(shù)類型不同時運算結(jié)果會怎么樣。

2.全等操作符 “===”

全等操作符”===”的情況相對來說比較簡單。當用全等操作符”===”來判斷時,首先檢查操作符兩邊操作數(shù)數(shù)據(jù)類型是否一致,若不一致,則直接返回false,否則,才進行下一步判斷。如果是兩個boolean的比較,則”===”兩邊必須同為true或同為false,才可以返回true,否則返回false.若兩相比較的是數(shù)字,那么只有當這兩個數(shù)字大小相等時才會返回true,否則返回false。如果要比較的兩個變量是字符串,先比較兩個字符串的長度length是否相等,如果長度不一樣,則返回false,如果相等,則從兩個變量的第一個字符開始比較是否相等,一直比較到最后一位,如果其中的某一位不想等,則返回false,否則返回true,(注意:字符串的比較是不會忽略空格的,所以在比較兩個字符串是否相等時,為確保安全,應(yīng)該先去除空格,然后把兩個字符串同轉(zhuǎn)為大寫或者小寫之后再進行比較)。而null只有在null===null的情況下才會返回true,其它情況都返回false,同樣,undefined只有在undefined===undefined的情況下才會返回true,否則返回false。如:

true === 1    //false
"1" === 1    //false
 
//boolean的比較
true === true  //true
true === false  //false

//string的比較
"hello" === "helloworrld" //false
"hello" === "world" //false
"hello" === " hello" //false
"hello" === "hellO" //false
"hello" === "hello" //true

//number的比較
1 === 1  //true
1 === 1.0 //true
1 === 1.2 //false

//null和undefined的比較
undefined === undefined  //true
null === null       //true
undefined === null    //false,兩者在"=="時才返回true

如果進行”===”比較的兩個操作數(shù)不是基本類型值,而是兩個對象,這時候判斷依據(jù)就是,判斷這兩個變量是否是”同一個”對象

var a,b,c;
a = b = {
	name : '柳輕侯',
	city : '南京'
};
c = {
	name : '柳輕侯',
	city : '南京'
};
a === b   //true
a === c   //false

兩個對象僅僅”長得一樣”是不夠的,a和c都是Object實例,且兩者擁有相同的屬性和值,可是這兩個卻不是”同一個”對象,因為實際上a和c指向了兩個不同的實例,所以這兩個對象是不全等的。而a和b卻是指向了同一個對象,換個說法,a和b是同一個對象的不同別名,他們實際上指向的對象是完全相同的,所以a === b?!?==” 與 “===” 比較規(guī)則一樣,在此不再贅述。

3.相等操作符”==”

全等操作符在進行判斷的時候,如果兩個變量的類型不同,則直接返回false,而與此不同,”==”相等操作符在判斷的時候,如果兩個變量的類型不同,則會做一個隱式的類型轉(zhuǎn)換,把要比較的兩個值轉(zhuǎn)化為相同的類型再做比較,那么這種轉(zhuǎn)化規(guī)則是怎么樣的?

在轉(zhuǎn)化不同數(shù)據(jù)類型時,相等和不等操作符遵循下面的基本規(guī)則

  • 如果其中一個操作數(shù)是是boolean值,則在比較之前會先將boolean值轉(zhuǎn)化為number值,true轉(zhuǎn)化為1,false轉(zhuǎn)為0;
  • 如果其中一個操作數(shù)是string類型,而另一個是number類型,則在比較之前先將string類型轉(zhuǎn)化為number類型再進行判斷;
  • 在比較之前,undefined和null是不會轉(zhuǎn)為其他值進行比較的;
  • 如果其中一個操作數(shù)是對象,而另一個是基本類型值,則在比較之前先將對象轉(zhuǎn)為基本類型值,然后再依據(jù)前面的規(guī)則進行后續(xù)的比較;

兩個操作數(shù)在比較時遵循下列規(guī)則

  • undefined和null是相等的,即:undefined == null;
  • 如果有一個操作數(shù)是NaN,那么返回false,即使兩個操作數(shù)都是NaN,也會返回false;
  • 如果兩個操作數(shù)是對象,則比較規(guī)則跟”===”的比較規(guī)則是一樣的,除非這兩個操作數(shù)是同一個對象,則返回true,否則返回false;

此處需要注意的是,NaN == NaN是返回false的,NaN意思是 not a number,也就是說該操作數(shù)是一個非數(shù)字,這個非數(shù)字是不確定的,它的值是未知的,甚至可能根本就不能用javascript的語法表示出來,這樣一個未知量是不能用來進行特定比較的,兩個未知的東西,如果不能確定它的值是什么,當然不能說 NaN == NaN。那么既然不能用”==”來比較,我們怎么去判定一個變量是不是NaN呢 ,既然不能用相等來判定,那么不妨反其道而行之,用”!=”來判定,判定一個變量是否不等于NaN。比如:

//如果需要判定一個變量是不是NaN,可以如下
//a是你需要判定的變量
if((typeof a === "number") && a != NaN ){  //此處需要注意,NaN也是number類型
	//TODO 
}

4.常見比較情況及其結(jié)果

null == undefined  // true 
"NaN" == NaN    // false 
5 == NaN      // false 
NaN == NaN     // false 
NaN != NaN     // true 
false == 0     // true 
true == 1      // true 
true == 2      // false 
undefined == 0   // false 
null == 0      // false
"5" == 5      // true

5.典型例題解析

![] == [] //true

這是一道比較容易令人困惑的題,按照正常的思維模式,對一個操作數(shù)邏輯取反,跟這個操作數(shù)本身的值是相對的,如果這個操作數(shù)本身的值是true,那么取反之后就是false,反之,如果這個操作數(shù)的值是false,那么對其邏輯取反之后就是true,無論如何也不會是同一個值,可是事實上卻是![] == []。首先,![]的值是false,因為這里[]被當成了一個數(shù)組的實例,是一個對象,而對象都是真值,對其取反,得到一個假值,也就是false。其次看等號右邊,[]是一個對象,要將其轉(zhuǎn)為基本類型值,會先調(diào)用數(shù)組的valueOf方法,而數(shù)組的valueOf方法返回數(shù)組本身,沒有得到一個基本值,這時候要繼續(xù)調(diào)用數(shù)組的toString方法,得到一個””空字符串,所以這時候也就變成了false == “”是否為真的問題了,而根據(jù)前面的規(guī)則,如果有一個操作數(shù)為boolean值,會將其轉(zhuǎn)為數(shù)值,false轉(zhuǎn)化為0。進而,問題轉(zhuǎn)化為0 == “”是否為真值的問題,當number和string比較時,會將string轉(zhuǎn)為number,而””會轉(zhuǎn)為0。最后,問題變演化成了0 == 0是否為真值,毋庸置疑,結(jié)果是true。這里要注意的就是![],它被當成了一個整體的邏輯值,是直接對對象進行取反,是一個假值,而不是先把[]轉(zhuǎn)化為基本值再取反

6.小結(jié)

“==”在比較不同類型值得時候會進行隱式的類型轉(zhuǎn)化,而”===”不會轉(zhuǎn)化,全等一定相等,相等卻不一定全等,這是一個充分不必要條件。undefined和null相等而不全等,且在相等比較的時候不會轉(zhuǎn)化為其他類型的值。NaN是不等于NaN 的,要判斷某個變量是不是NaN,要用”!=”。對象和非對象在進行比較的時候會先轉(zhuǎn)為基本類型值然后再根據(jù)上面的規(guī)則進行比較。

7.參考資料

《javascript高級程序設(shè)計》
《javascript權(quán)威指南》

相關(guān)文章

  • 淺談JavaScript中的對象及Promise對象的實現(xiàn)

    淺談JavaScript中的對象及Promise對象的實現(xiàn)

    這篇文章主要介紹了淺談JavaScript中的對象及Promise對象的實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • swiper+echarts實現(xiàn)多個儀表盤左右滾動效果

    swiper+echarts實現(xiàn)多個儀表盤左右滾動效果

    這篇文章主要為大家詳細介紹了swiper+echarts實現(xiàn)多個儀表盤左右滾動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 簡單的兩種Extjs formpanel加載數(shù)據(jù)的方式

    簡單的兩種Extjs formpanel加載數(shù)據(jù)的方式

    這篇文章介紹了兩種Extjs formpanel加載數(shù)據(jù)的方式,有需要的朋友可以參考一下
    2013-11-11
  • JS中操作JSON總結(jié)

    JS中操作JSON總結(jié)

    本篇文章主要是對JS操作JSON進行了總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02
  • JavaScript實現(xiàn)單點登錄的示例

    JavaScript實現(xiàn)單點登錄的示例

    這篇文章主要介紹了JavaScript實現(xiàn)單點登錄的示例,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下
    2020-09-09
  • JavaScript 中Date對象的格式化代碼方法匯總

    JavaScript 中Date對象的格式化代碼方法匯總

    JavaScript默認的時間格式我們一般情況下不會用,所以需要進行格式化,下面小編給大家?guī)砹巳Njs date對象格式化實例代碼,需要的朋友參考下吧
    2017-09-09
  • javascript垃圾收集機制的原理分析

    javascript垃圾收集機制的原理分析

    javascript具有自動垃圾收集機制,執(zhí)行環(huán)境會負責管理代碼執(zhí)行過程中使用的內(nèi)存。在編寫javascript程序時,開發(fā)人員不用再關(guān)心內(nèi)存使用問題,所需內(nèi)存的分配以及無用內(nèi)存的回收完全實現(xiàn)了自動管理。本文將詳細介紹javascript的垃圾收集機制
    2016-12-12
  • 詳解ES6 系列之異步處理實戰(zhàn)

    詳解ES6 系列之異步處理實戰(zhàn)

    這篇文章主要介紹了詳解ES6 系列之異步處理實戰(zhàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • jsonp實現(xiàn)百度下拉框功能的方法分析

    jsonp實現(xiàn)百度下拉框功能的方法分析

    這篇文章主要介紹了jsonp實現(xiàn)百度下拉框功能的方法,結(jié)合實例形式分析了調(diào)用百度接口jsonp實現(xiàn)跨域請求及內(nèi)容渲染相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • JavaScript canvas動畫實現(xiàn)時鐘效果

    JavaScript canvas動畫實現(xiàn)時鐘效果

    這篇文章主要為大家詳細介紹了JavaScript canvas動畫實現(xiàn)時鐘效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評論