js隱式轉換相關知識(轉載)

js隱式轉換相關知識

學習自(純紀錄自己學了甚麼,非營利)

https://zhuanlan.zhihu.com/p/38976424

!轉換

轉換成Boolean然後取反,沒啥特別的

== 轉換

兩邊都是引用類型

直接比較內存中的地址

1
console.log([]==[]) //false,指针指向的地址不同

如果兩邊類型不一致,則兩邊都轉成number類型

引用類型先調用valueOf()方法,如果能轉成數字就OK

不能轉成數字的話,就調用toString()轉成字符串。

再轉換成數字

一些例子

  1. var a = '123'
    console.log(a==false)  //false,'123'转成数字是123,右侧转成数字是0,最终比较123==0
    console.log(a == 123)  //true,右边是数字,直接转换左右即可
    <!--1-->
  2. var a = {} 
    console.log(a == 1)
    //上面a==1在js解释引擎中的执行过程如下:
    //a.valueOf()获取到的不是基本类型,调用a.toString()得到'[object Object]'
    '[object Object]' == 1;
    //两边类型不致,左侧转成数字
    NaN == 1;//false,NaN跟任何类型比较都为false
    <!--2-->
    

思想構成:

一個中心(左右兩邊轉換成number為中心),兩個基本點(轉換條件:1.類型不同時才轉換2.兩邊都是引用類型時直接比較地址),一國兩制(null、NaN、undefined使用一套製作,其它的使用另一套制度)

大於或小於符

字符串類型比較大小時,不進行類型轉換,而是逐位比較ascii碼

第1位不同則返回結果,否則繼續比較第2位,直到某一位不同為止

+號規則

+號運算符即可以對兩個數相加,也可以連接字符串,那如果是[1,2,3]+4這種情況下又會發生什麼呢?這就需要我們了解相應的規則,為了方便描述,我們把+號左側的值叫做A,右側的叫做B:

  1. 如果A和B都是number類型,直接相加;
  2. 接下來看A或B中是否有一個是否為string類型,如果有,則將另一個也轉成字符串,然後連接;
  3. 既不是number,也不是string,則按如下規則轉換:
    1.能轉換成數字,返回之
    2.否則調用valueOf(),如果執行結果是基本類型,返回之;
    3.否則調用toString(),如果執行結果是基礎類型,返回之;
    4.無法得到原始值,拋異常。