JavaScript中的相等運算符"==",你真的搞懂了麼?

Brendan Eich在設計JavaScript的時候是沒有加入類型系統的,因此JavaScript是一門動態語言,類型是進入執行上下文的時候可能纔去肯定,這就可能出現一個JavaScript變量在上一瞬間是String,下一瞬間就是Number了,在這個過程當中,JavaScript變量進行了類型的轉換。使用Javascript進行相等運算時,咱們可能會用"==","==="和Object.is來進行比較兩個值是否相等。web

  1. 使用===時,恆等,嚴格比較運算符,不作類型轉換,類型不一樣就是不等,NaN與NaN不相等。
  2. 使用Object.is()時,其行爲與"==="基本一致,不過有兩處不一樣:
  • +0不等於-0。
  • NaN等於自身。
  1. 使用==時,不一樣類型的值也能夠被看做相等。這可能會讓不少的JavaScript困開發者感到困惑。使用"=="時,不一樣的數據類型都發生了哪些類型變化過程呢?

Javascript數據類型

在講到類型轉換以前,咱們把JavaScript的數據類型再進行梳理一遍,最新的 ECMAScript標準定義了 8種原始數據類型,8種原始數據類型又分爲7種基本數據類型和1種引用類型。數組

  • 基本類型

Undefined、 Null、 String、 Number、 Boolean、Symbol和BigInt這7種數據類型都是屬於基本類型,基本類型都是不可變的,不可變是指基本類型自己和一個賦值爲基本類型的變量的區別。變量會被賦予一個新值,而原值不能像數組、對象以及函數那樣被改變。markdown

  • 引用類型:Object(對象),包括了數組(Array)、函數(Function)、正則(RegExp)和日期(Date)。

不一樣類型的值使用「==」運算符後的轉換規則

類型(x) 類型(y) 類型(y)
null undefined true
undefined null true
數字 字符串 x == toNumber(y)
字符串 數字 y== toNumber(x)
布爾值 任何類型 toNumber(x) == y
任何類型 布爾值 x == toNumber(y)
字符串或數字 對象 x == toPrimitive(y)
對象 字符串或數字 toPrimitive(x)== y

toNumber對不一樣類型值的轉換規則:函數

  • undefined: NaN
  • null: +0
  • Boolean:true:1,flase: 0
  • 數值返回對應的數值

toPrimitive對於基本類型不作轉換,輸出等於輸入,對於對象,若是對象的valueOf方法的結果是原始值,則返回原始值,若是對象的toString方法返回的是原始值,則返回這個值,其餘狀況則返回一個錯誤。oop

toNumber和toPrimitive屬於內部的方法ecma對於這兩個方法的描述url

例子:
1 console.log('juejin' ? true : false); // true
2 console.log('juejin' == true); // false
複製代碼

第一行的代碼執行結果是true,第二行代碼的執行結果是false,爲何會出現這樣的結果呢?spa

  1. 按照上面給出的規則,true會被toNumber方法轉換成1,即變成了'juejin' == 1,
  2. 'juejin'有被toNumber方法轉換成NaN,即最後的表達式變成了NaN == 1,因此返回false。

按照上面的方法,那'juejin' == false是否是會返回true呢?答案仍是false,爲何呢?prototype

  1. 按照上面給出的規則,false會被toNumber方法轉換成0,即變成了'juejin' == 0,
  2. 'juejin'有被toNumber方法轉換成NaN,即最後的表達式變成了NaN == 0,因此返回false。

擴展-數據類型判斷

  1. typeof,基本數據類型,除了null以外,能夠經過typeof操做符進行類型的判斷:
  • undefined:typeof instance === "undefined"
  • Boolean:typeof instance === "boolean"
  • Number:typeof instance === "number"
  • String:typeof instance === "string
  • BigInt:typeof instance === "bigint"
  • Symbol :typeof instance === "symbol"

null也是基本類型, typeof null === "object",這是JS語言自己的一個bug。不一樣的對象在底層都表示爲二進制,在js中二進制前三位都爲0的話會被判斷爲object類型,null的二進制表示全是0,天然前三位也是0,因此執行typeof時返回"object"。 另外,引用類型裏面的function也能夠使用typeof判斷:設計

  • Function :typeof instance === "function"

其他的引用類型一概返回"object"。3d

  1. instanceof

instanceof運算符用來檢測constructor.prototype是否存在於某個實例對象的原型鏈上。

function Class1() {
    console.log('Class1');
}

function Class2() {
    console.log('Class2');
}

const obj1 = new Class1();

obj1 instanceof Class1; // true

obj1 instanceof Class2; // false

Class1.prototype = {};

obj1 instanceof Class1; // false
複製代碼

除此以外,Object.prototype.toString.call和construct也能夠進行數據類型的判斷。

相關文章
相關標籤/搜索