1. 程式人生 > 其它 >【隨筆】js中==和===區別

【隨筆】js中==和===區別

等於操作符:==

如果運算元相等,則返回 true。在比較過程中,會先進行型別轉換,再確定運算元是否相等。

比較過程:

  • 相同操作型別,相同則進行運算元比較
  • 不同操作型別,先進行資料型別轉換
    • 兩個簡單型別,字串和布林值都會轉為數值,再比較
    • 簡單型別與引用型別,物件轉化成其原始型別的值,再比較
    • 兩個引用型別,則比較是否指向同一物件
    • nullundefined 相等
    • 存在 NaN 則返回 false

布林值和字串,在與數值比較時,會轉為數值進行比較

// true為布林型,轉為數值1
true == 1; // true
// "1"為字串型,轉為數值1
"1" == 1; // true

布林值和字串比較,兩側型別不同,布林值會轉為數值0/1,此時為數值 == 字串

,兩側操作型別仍然不同,此時字串會轉為數值,進行 數值 === 數值比較,運算元相同返回 true

// 轉為 1 === 1
true == "1"; // true

// 轉為 1 === 2
true == "2"; // false

// 物件屬性一般為空(null) 或者為未定義(undefined)

null == undefined; // true
"undefined" == undefined; // false

NaN表示一個值不是數值型別,判斷一個值非數值型別使用isNaN()

NaN == NaN; // false
isNaN(NaN); // true

兩個物件,比較是否指向同一個物件

let obj1 = {name:"xxx"};
let obj2 = {name:"xxx"};
let obj2 = obj1;
obj1 == obj2; // false
obj1 == obj3; // true

全等操作符 ===

只有兩個運算元在不轉換的前提下相等才返回true,要求型別相同,值相同。

比較過程:

  • 如果型別不同,就一定不相等
  • 如果兩個都是數值,並且是同一個值,那麼相等;如果其中至少一個是NaN,那麼不相等。(判斷一個值是否是NaN,只能使用isNaN( ) 來判斷)
  • 如果兩個都是字串,每個位置的字元都一樣,那麼相等,否則不相等。
  • 如果兩個值都是true,或是false,那麼相等
  • 如果兩個值都引用同一個物件或是函式,那麼相等,否則不相等
  • 如果兩個值都是null,或是undefined,那麼相等

全等操作符不會進行型別轉換

"1" === 1; // false,不相等,資料型別不同
1 === 1); // true,相等,資料型別相同值也相同

nullundefined與自身嚴格相等

null === null; // true
undefined === undefined; // true

小結

 
等於操作符 == 會經過型別轉換後轉為全等比較 === ,雖然容錯性較高,但是 === 全等更加準確和高效,一般的等於操作建議使用 ===
物件屬性的比較,如果是判斷null 或者undefined,使用相等操作符==更加簡潔。
 

 const obj = {};
 if(obj.x == null){
     ...
 }
 // 等同於
 if(obj.x === null || obj.x === undefined){
     ...
 }

參考文件:
https://vue3js.cn/interview/JavaScript/%20_=.html
https://www.cnblogs.com/nelson-hu/p/7922731.html