1. 程式人生 > >JS/JavaScript中兩個等號 == 和 三個等號 === 的區別

JS/JavaScript中兩個等號 == 和 三個等號 === 的區別

JavaScript中兩個等號 == 和 三個等號 === 的區別 一、概念 == 和 ===  (1)  "=="叫做相等運算子,"==="叫做嚴格運算子。 (2) ==,equality -> 等同  的意思, 兩邊值型別不同的時候,要先進行型別轉換為同一型別後,再比較值是否相等。  ===,identity -> 恆等 的意思,不做型別轉換,型別不同的結果一定不等。  (3) "=="表示只要值相等即可為真,而"==="則要求不僅值相等,而且也要求型別相同。 對於明確資料型別的用===更為可靠,JavaScript是一門弱型別語言,表示式運算賦值等操作都會導致型別轉換。而一些隱式轉換會帶來一些意想不到的後果。
程式設計建議:儘量使用嚴格運算子 ===。因為"=="不嚴謹,可能會帶來一些違反直覺的後果。 二、嚴格運算子 === 的運算規則 嚴格運算子===的運算規則如下, (1)不同型別值
如果兩個值的型別不同,直接返回false。
(2)同一類的原始型別值
同一型別的原始型別的值(數值number、字串string、布林值boolean)比較時,值相同就返回true,值不同就返回false。 (3)同一類的複合型別值/高階型別
兩個複合型別(物件Object、陣列Array、函式Funtion)的資料比較時,不是比較它們的值是否相等,而是比較它們是否指向同一個物件。即“地址指標”是否相等。
(4)undefined和null
//undefined 和 null 與自身嚴格相等。
null === null  //trueundefined === undefined  //trueundefined === null //true 三、相等運算子 "== "的運算規則
相等運算子"=="在比較相同型別的資料時,與嚴格運算子"==="完全一樣。
在比較不同型別的資料時,相等運算子"=="會先將資料進行型別轉換,然後再用嚴格相等運算子"==="比較。型別轉換規則如下:
(1)原始型別的值
原始型別的資料會轉換成數值型別再進行比較。字串和布林值都會轉換成數值
(2)物件與原始型別值比較
物件(這裡指廣義的物件,包括數值和函式)與原始型別的值比較時,物件轉化成原始型別的值,再進行比較。
(3)undefined和null
undefined和null與其他型別的值比較時,結果都為false,它們互相比較時結果為true。
(4)相等運算子"=="的缺點
相等運算子"=="隱藏的型別轉換,會帶來一些違反直覺的結果。
'' == '0'          // false
0 == ''            // true
0 == '0'            // true
false == 'false'    // false
false == '0'        // true
false == undefined  // false
false == null      // false
null == undefined  // true
' \t\r\n ' == 0    // true
這就是為什麼建議儘量不要使用相等運算子"=="
至於使用相等運算子"=="會不會對後續程式碼造成意外影響,答案是有可能會。
建議儘量使用"===",因為"=="不嚴謹,可能會帶來一些違反直覺的後果。比如我們常使用的物件,有時獲取不到而被賦值為undefine的情況。
var a = undefined;
if(!a){
    console.log("1"); //1
}

var a = undefined;
if(a == null){
    console.log("1"); //1
}

var a = undefined;
if(a === null){
    console.log("1"); //無輸出
}
也就是說當a為undefined時,輸出的值會有變化,而在程式設計中物件變成undefined實在是太常見了。 “==”帶來的便利性抵不上其帶來的複雜性和bug成本。舉個簡單的例子,團隊協作中你肯定需要讀別人的程式碼。而當你看到“==”時,要判斷清楚作者的程式碼意圖是確實需要轉型別,還是無所謂要不要轉型別只是隨手寫了,還是不應該轉型但是寫錯了……所花費的腦力和時間比明確的“===”(加上可能需要的明確轉型)要多得多。
三、JavaScript中 "==" 的坑
JavaScript 裡各種比較坑你踩過嗎?比如下面這些表示式,你猜猜答案是什麼:
undefined == null
false == " \t    """ == 0123 == "123""1" == true 上面的答案都是true 雖然你可以說,既然語言這樣設計,肯定有它自己的道理啊。但是別忘了,JavaScript 是一個動態型別語言啊,假如你寫了這樣的程式碼:
function fix(n) {
    if (n == 0) return n + 1;    return n + 2;} 如果輸入n為字串值"0"的話,恭喜你,你的程式爆炸啦!  你將會得到字串"01"作為返回值,而不是你想要的數字1。所以一句話概括沒有型別限制,型別轉換的後果將是不可預料的。 而且你寫的程式很大的話,你可能在這上面浪費好幾個小時找 bug。所以在自己需求明確的情況下,為什麼不寫===來避免可能的 bug 呢?
那麼這種不嚴格比較確實就一無是處嗎?不,比如你想判斷一個字串看起來是不是空白的(由空白字元組成),可以這樣寫:
if (typeof str === "string" && str == false)
console.log("The string is full of white spaces!");
四、JavaScript中 == 和 === 的詳細比較規則
下面分別說明: 
先說 ===,這個比較簡單。下面的規則用來判斷兩個值是否===相等: 
1、如果型別不同,就[不相等] 
2、如果兩個都是數值,並且是同一個值,那麼[相等];(!例外)的是,如果其中至少一個是NaN,那麼[不相等]。(判斷一個值是否是NaN,只能用isNaN()來判斷) 
3、如果兩個都是字串,每個位置的字元都一樣,那麼[相等];否則[不相等]。 
4、如果兩個值都是true,或者都是false,那麼[相等]。 
5、如果兩個值都引用同一個物件或函式,那麼[相等];否則[不相等]。 
6、如果兩個值都是null,或者都是undefined,那麼[相等]。 
再說 ==,根據以下規則: 
1、如果兩個值型別相同,進行 === 比較。 
2、如果兩個值型別不同,他們可能相等。根據下面規則進行型別轉換再比較: 
a、如果一個是null、一個是undefined,那麼[相等]。 
b、如果一個是字串,一個是數值,把字串轉換成數值再進行比較。 
c、如果任一值是 true,把它轉換成 1 再比較;如果任一值是 false,把它轉換成 0 再比較。 
d、如果一個是物件,另一個是數值或字串,把物件轉換成基礎型別的值再比較。物件轉換成基礎型別,利用它的toString或者valueOf方法。 js核心內建類,會嘗試valueOf先於toString;例外的是Date,Date利用的是toString轉換。
e、任何其他組合,都[不相等]。 
舉例: 
"1" == true 
型別不等,true會先轉換成數值 1,現在變成 "1" == 1,再把"1"轉換成 1,比較 1 == 1, 相等。 
= 賦值運算子 
== 等於 
=== 嚴格等於 
var a = 3; 
var b = "3"
console.info(a==b); //返回 true console.info(a===b); //返回 false  因為a,b的型別不一樣 
===用來進行嚴格的比較判斷。
五、總結
共2點結論:  1、程式設計建議:儘量使用嚴格運算子 ===。因為"=="不嚴謹,可能會帶來一些違反直覺和意想不到的後果。
2、少用==因為沒有型別限制,型別轉換的後果將是不可預料的。

相關推薦

JS/JavaScript等號 == 等號 === 的區別

JavaScript中兩個等號 == 和 三個等號 === 的區別 一、概念 == 和 ===  (1)  "=="叫做相等運算子,"==="叫做嚴格運算子。 (2) ==,equalit

js等號(==)等號(===)的區別

js中兩個等號(==)和三個等號(===)的區別: 1. "=="表示:equality -> 等同  的意思,"=="使用兩個等號時,如果兩邊值的型別不同的時候,是要先先進行型別轉換後,才能做比較。 2. "==="表示:identity -> 恆等 的意思,

Android-LayoutInflaterinflate方法引數引數的區別

關於inflate引數問題,我想很多人多多少少都瞭解一點,網上也有很多關於這方面介紹的文章,但是枯燥的理論或者翻譯讓很多小夥伴看完之後還是一臉懵逼,so,我今天想通過三個案例來讓小夥伴徹底的搞清楚這個東東。本篇部落格我們不講原始碼,只看使用。原始碼的解讀會在下一篇博文中帶

案例帶你看懂LayoutInflaterinflate方法引數引數的區別

關於inflate引數問題,我想很多人多多少少都瞭解一點,網上也有很多關於這方面介紹的文章,但是枯燥的理論或者翻譯讓很多小夥伴看完之後還是一臉懵逼,so,我今天想通過三個案例來讓小夥伴徹底的搞清楚這個東東。本篇部落格我們不講原始碼,只看使用。原始碼的解讀會在下一篇博文中帶來。

JavaScriptMath.max.apply()Math.max()的區別

作用 div 調用 class color his arr array this JavaScript中Math.max()方法可以求出給定參數中的最大值,給定參數≥2個,可以使多個,但是必須是數字。 > Math.max(1,2,3,5,9,4); < 9

【總結整理】租房產品創業的方向產品---摘自《人人都是產品經理》

價值 變現 ash 服務費 聯系 tro 青年公寓 其中 高質量 創業產品反思錄:從拆解元需求到產品定位 人人都是產品經理社區 發布於 2018-10-08 08:56:31 舉報 閱讀數:466 ??10個人,10個月,100萬,3款產品,我們在變幻莫測的租房領域

什麼是軟體需求,什麼是功能需求?——論需求的層次方面(2)

  業務需求(Business requirement)表示組織或客戶高層次的目標。業務需求通常來自專案投資人、購買產品的客戶、實際使用者的管理者、市場營銷部門或產品策劃部門。業務需求描述了組織為什麼要開發一個系統,即組織希望達到的目標。使用前景和範圍(vision and scope)文件來記錄業務需求,這

JavaScript知識點總結(五)之Javascript等於號(==)等於號(===)的區別

一、JavaScript"=="的作用 1.當==兩邊的內容是字串時,則比較字串的內容是否相等。 2.當==兩邊的內容是數字時,則比較數字的大小是否相等。 3.當==兩邊的內容是物件或者是物件的函式屬性時,則比較記憶體地址是否相等。 二、==和===的區別   ==用於一般比較,===用於嚴格比較,

js等於號等於號的區別

首先,== equality 等同,=== identity 恆等。 ==, 兩邊值型別不同的時候,要先進行型別轉換,再比較。 ==,不做型別轉換,型別不同的一定不等。 下面分別說明: 先說 ===,這個比較簡單。下面的規則用來判斷兩個值是否===相等: 1、如果型別不同,

java 一個等於號等於號等號區別

一個等號是賦值號,兩個等號是判斷號。賦值表示把右邊的值或引用賦給左邊的變數,判斷號表示返回符號兩邊的值是否相等,這裡的值包括引用。相等運算子"==",如果兩個運算元不是同一型別,則會先嚐試轉換型別在進行比較。嚴格相等運算子“==="首先計算其運算元的值,然後比較這兩個值,比較

案例帶你看懂LayoutInflaterinflate方法參數參數的區別

tco rom net roi 異常 com 組成 @override 修改 版權聲明:本文為sang原創文章,轉載請註明出處。 目錄(?)[+] 關於inflate參數問題,我想很多人多多少少都了解一點,網上也有很多關於這方面介紹的文章,但是枯燥的理論或

JavaScript一個等號、二等號等號區別

一個等號是賦值操作,==先轉換型別再比較,===先判斷型別,如果不是同一型別直接為false。=== 判斷規則如果型別不同,就[不相等] 如果兩個都是數值,並且是同一個值,那麼[相等];(!例外)的是,如果其中至少一個是NaN,那麼[不相等]。(判斷一個值是否是NaN,只能用

js改變this指向的常用方法bind,callapply

一.bind:說起bind,很多人都會想起jquery中的bind繫結方法,給元素繫結事件,今天所講的bind則是js的原生方法---可改變this的指向,下面我們來看演示:var name = 'sally'; function sayName(){ return

java等號等號區別

首先,== equality 等同,=== identity 恆等。 ==, 兩邊值型別不同的時候,要先進行型別轉換,再比較。 ===,不做型別轉換,型別不同的一定不等。下面分別說明: 先說 ===,這個比較簡單。下面的規則用來判斷兩個值是否===相等: 1、如果型別不同,就

js ==與===區別等號等號) 《轉》

== equality 等同,=== identity 恆等。 ==, 兩邊值型別不同的時候,要先進行型別轉換,再比較。 ===,不做型別轉換,型別不同的一定不等。 下面分別說明: 先說 ===,這個比較簡單。下面的規則用來判斷兩個值是否===相等: 1、如果型別不同,就[不相等] 2、如果兩個都是數值

面試官:能解釋一下javascriptbind、applycall這函式的用法嗎

一.前言     不知道大家還記不記得前一篇文章:《面試官:能解釋一下javascript中的this嗎》   那今天這篇文章雖然是介紹javascript中bind、apply和call函式,但是多少也和this有點關聯。   假如在前面那場面試末尾,面試官不依不饒繼續問你javascr

JS實現輸出一個字符串第一連續的數字

數字 length 個數字 pri split ret () 第一個 spl 問題描述:在一個字符串中,輸出其中第一個連續的三個數字。例如:str="1234568" 輸出:1 2 3。   var printNum = function(){     var str =

一個數組個數的為N,找出這數字的下標

完整 進行 代碼 ray 由於 比較 返回 put else 分析,兩個數字的和為N。那麽這兩個數字是否是唯一的呢?輸出的下標是否是第一對出現的呢? 1,我們假設這兩個數字是唯一的 和是唯一的,那麽其中一個數字越大,另一個數字就越小。想到大小關系,我們就想到了排序。那麽首先

淺析Android Camera開發尺寸種變形 貢獻一個自適配PicturesizePreviewsiz

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

關於js物件函式互相呼叫,其中一個為定時器宣告,定時器迴圈報錯問題(記錄一次嘗試新寫法的報錯經歷)附帶無縫輪播圖程式碼

先上之前的錯誤程式碼吧,注意計時器這個方法(是想把之前寫的的輪播圖演示重構一下) var obj = { sleepTime: 2000,//輪播延時 cont: 0,//第幾張 origin: document.getElementsByClassName('main-