JS/JavaScript中兩個等號 == 和 三個等號 === 的區別
如果兩個值的型別不同,直接返回false。
(2)同一類的原始型別值
同一型別的原始型別的值(數值number、字串string、布林值boolean)比較時,值相同就返回true,值不同就返回false。 (3)同一類的複合型別值/高階型別
兩個複合型別(物件Object、陣列Array、函式Funtion)的資料比較時,不是比較它們的值是否相等,而是比較它們是否指向同一個物件。即“地址指標”是否相等。
//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-LayoutInflater中inflate方法兩個引數和三個引數的區別
關於inflate引數問題,我想很多人多多少少都瞭解一點,網上也有很多關於這方面介紹的文章,但是枯燥的理論或者翻譯讓很多小夥伴看完之後還是一臉懵逼,so,我今天想通過三個案例來讓小夥伴徹底的搞清楚這個東東。本篇部落格我們不講原始碼,只看使用。原始碼的解讀會在下一篇博文中帶
三個案例帶你看懂LayoutInflater中inflate方法兩個引數和三個引數的區別
關於inflate引數問題,我想很多人多多少少都瞭解一點,網上也有很多關於這方面介紹的文章,但是枯燥的理論或者翻譯讓很多小夥伴看完之後還是一臉懵逼,so,我今天想通過三個案例來讓小夥伴徹底的搞清楚這個東東。本篇部落格我們不講原始碼,只看使用。原始碼的解讀會在下一篇博文中帶來。
JavaScript中Math.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中 一個等於號和兩個等於號三個等號的區別?
一個等號是賦值號,兩個等號是判斷號。賦值表示把右邊的值或引用賦給左邊的變數,判斷號表示返回符號兩邊的值是否相等,這裡的值包括引用。相等運算子"==",如果兩個運算元不是同一型別,則會先嚐試轉換型別在進行比較。嚴格相等運算子“==="首先計算其運算元的值,然後比較這兩個值,比較
三個案例帶你看懂LayoutInflater中inflate方法兩個參數和三個參數的區別
tco rom net roi 異常 com 組成 @override 修改 版權聲明:本文為sang原創文章,轉載請註明出處。 目錄(?)[+] 關於inflate參數問題,我想很多人多多少少都了解一點,網上也有很多關於這方面介紹的文章,但是枯燥的理論或
JavaScript中一個等號、二個等號、 三個等號 的區別
一個等號是賦值操作,==先轉換型別再比較,===先判斷型別,如果不是同一型別直接為false。=== 判斷規則如果型別不同,就[不相等] 如果兩個都是數值,並且是同一個值,那麼[相等];(!例外)的是,如果其中至少一個是NaN,那麼[不相等]。(判斷一個值是否是NaN,只能用
js中改變this指向的三個常用方法bind,call和apply
一.bind:說起bind,很多人都會想起jquery中的bind繫結方法,給元素繫結事件,今天所講的bind則是js的原生方法---可改變this的指向,下面我們來看演示:var name = 'sally'; function sayName(){ return
java中兩個等號跟三個等號的區別?
首先,== equality 等同,=== identity 恆等。 ==, 兩邊值型別不同的時候,要先進行型別轉換,再比較。 ===,不做型別轉換,型別不同的一定不等。下面分別說明: 先說 ===,這個比較簡單。下面的規則用來判斷兩個值是否===相等: 1、如果型別不同,就
js ==與===區別(兩個等號與三個等號) 《轉》
== equality 等同,=== identity 恆等。 ==, 兩邊值型別不同的時候,要先進行型別轉換,再比較。 ===,不做型別轉換,型別不同的一定不等。 下面分別說明: 先說 ===,這個比較簡單。下面的規則用來判斷兩個值是否===相等: 1、如果型別不同,就[不相等] 2、如果兩個都是數值
面試官:能解釋一下javascript中bind、apply和call這三個函式的用法嗎
一.前言 不知道大家還記不記得前一篇文章:《面試官:能解釋一下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開發中的三個尺寸和三種變形 貢獻一個自適配Picturesize和Previewsiz
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
關於js物件中兩個函式互相呼叫,其中一個為定時器宣告,定時器迴圈報錯問題(記錄一次嘗試新寫法的報錯經歷)附帶無縫輪播圖程式碼
先上之前的錯誤程式碼吧,注意計時器這個方法(是想把之前寫的的輪播圖演示重構一下) var obj = { sleepTime: 2000,//輪播延時 cont: 0,//第幾張 origin: document.getElementsByClassName('main-