iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
0
Modern Web

從技術文章深入學習 JavaScript系列 第 21

Day 21 [其他03] js隱式轉換相關知識

  • 分享至 

  • xImage
  •  

文章選自

作者:朝阳区吃瓜群众

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

來源:知乎

!轉換

https://ithelp.ithome.com.tw/upload/images/20201006/20124350ukU2K0Bpp5.png

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

== 轉換

兩邊都是引用類型

直接比較內存中的地址

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,右边是数字,直接转换左右即可
    
  2. var a = new String(123)
    console.log(a == 123) //true,a.valueOf()结果就是数字123,最终比较的是123==123
    
  3. var a = {} 
    console.log(a == 1)
    //上面a==1在js解释引擎中的执行过程如下:
    //a.valueOf()获取到的不是基本类型,调用a.toString()得到'[object Object]'
    '[object Object]' == 1;
    //两边类型不致,左侧转成数字
    NaN == 1;//false,NaN跟任何类型比较都为false
    
  4. null、NaN、undefined和string、number、boolean、object類型比較時,都不做隱式轉換,比較的結果直接為false。但是需要注意以下幾個規則:

    console.log(NaN==NaN) //false
    console.log(undefined==null) //true
    console.log(null==null) //true
    console.log(null==undefined) //true
    

思想構成:

一個中心(左右兩邊轉換成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. 無法得到原始值,拋異常。

https://ithelp.ithome.com.tw/upload/images/20201006/20124350IgPiFiL7Xp.jpg


上一篇
Day 20 [整理02] 淺析JavaScript閉包
下一篇
Day 22 [編程01] JavaScript 複雜判斷的更優雅寫法
系列文
從技術文章深入學習 JavaScript29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言