解析JavaScript的隱式類型轉換

avaScript的數據類型分爲六種,分別爲null,undefined,boolean,string,number,object。object是引用類型,其它的五種是基本類型或者是原始類型。我們可以用typeof方法打印來某個是屬於哪個類型的。不同類型的變量比較要先轉類型,叫做類型轉換,類型轉換也叫隱式轉換。隱式轉換通常發生在運算符加減乘除,等於,還有小於,大於等。。

typeof '11'  //string 
typeof(11)  //number
'11' < 4     //false

基本類型的轉換

下面先講加減乘除:

1.字符串加數字,數字就會轉成字符串。

2.數字減字符串,字符串轉成數字。如果字符串不是純數字就會轉成NaN。字符串減數字也一樣。兩個字符串相減也先轉成數字。

3.乘,除,大於,小於跟減的轉換也是一樣。

//隱式轉換 + - * == / 
// + 
10 + '20'    //2010
// -
10 - '20'    //-10
10 - 'one'   //NaN
10 - '100a'  //NaN
// *
10*'20'      //200
'10'*'20'    //200
// /
20/'10'      //2
'20'/'10'    //2
'20'/'one'  //NaN

再來看看一組 == 的。

1.undefined等於null

2.字符串和數字比較時,字符串轉數字

3.數字爲布爾比較時,布爾轉數字

4.字符串和布爾比較時,兩者轉數字

// ==
undefined == null;    //true
'0' == 0;            //true,字符串轉數字
0 == false;           //true,布爾轉數字
'0' == false;       //true,兩者轉數字
null == false;       //false
undefined == false;  //false

引用類型的轉換

基本類型間的比較相對簡單。引用類型和基本類型的比較就相對複雜一些,先要把引用類型轉成基本類型,再按上述的方法比較。引用類型轉布爾全是true。比如空數組,只要是對象就是引用類型,所以[]爲true。引用類型轉數字或者字符串就要用valueOf()或者toString();對象本身就繼承了valuOf()和toString(),還可以自定義valueOf()和toString()。根據不同的對象用繼承的valueOf()轉成字符串,數字或本身,而對象用toString就一定轉爲字符串。一般對象默認調用valueOf()。

1.對象轉數字時,調用valueOf();

2.對象轉字符串時,調用toString();

本次給大家推薦一個免費的學習圈,裏面概括移動應用網站開發,css,html,webpack,vue node angular以及面試資源等。獲取資料👈👈👈
對web開發技術感興趣的同學,歡迎加裙:👉👉👉582735936 👈👈👈,不管你是小白還是大牛我都歡迎,還有大牛整理的一套高效率學習路線和教程與您免費分享,同時每天更新視頻資料。
最後,祝大家早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峯。

先看看下面的例子:

0 == [];        // true, 0 == [].valueOf(); -> 0 == 0;
'0' == [];      // false, '0' == [].toString(); -> '0' == '';
2 == ['2'];     // true, 2 == ['2'].valueOf(); -> 2 == '2' -> 2 == 2;
'2' == [2];     // true, '2' == [2].toString(); -> '2' =='2';

[] == ![];      //true, [].valueOf() == !Boolean([]) -> 0 == false -> 0 == 0;

對象轉成數字時,調用valueOf(),在這之前先調用的是toString();所以我猜valueOf方法是這樣的。So上面的例子 0 == []要改成下面更合理。無論如何,[]最後是轉成0的。

<pre class="hljs javascript" style="margin: 15px auto; padding: 10px 15px; display: block; overflow-x: auto; color: rgb(51, 51, 51); background: rgb(251, 251, 251); word-break: break-all; overflow-wrap: break-word; white-space: pre-wrap; font: 12px/20px "courier new"; border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial;">var valueOf = function (){
var str = this.toString(); //先調用toString(),轉成字符串
//...
}
0 == []; // true, 0 == [].valueOf(); -> 0 == '0' -> 0 == 0;</pre>

自定義的valueOf()和toString();

1.自定義的valueOf()和toString()都存在,會默認調用valueOf();

2.如果只有toString(),則調用toString();

var a = [1];

a.valueOf = function (){ return 1;}
a.toString = function (){ return '1';}

a + 1;         // 2, valueOf()先調用

去掉valueOf()就會調用toString()。

var a = [1];

a.valueOf = function (){ return 1;}
a.toString = function (){ return '1';}

a + 1;         // 2, 先調用valueOf()
//去掉valueOf
delete a.valueOf;
a + 1;        // '11', 調用toString()

如果返回其它會怎麼樣呢?

var a = [1];

a.valueOf = function (){return ;}
a.toString = function (){return 1 ;};

1 - a;        //NaN

其它對象 調用valueOf()轉成不同的類型:

var a = {};
a.valueOf();    //Object {}
var a = [];
a.valueOf();    //[]    自己本身
var a = new Date();
a.valueOf();    //1423812036234  數字
var a = new RegExp();
a.valueOf();    //    /(?:)/  正則對象

引用類型之間的比較是內存地址的比較,不需要進行隱式轉換,這裏不多說。

[] == []  //false 地址不一樣

var a = [];
b = a;
b == a   //true

顯式轉換

顯式轉換比較簡單,可以直接用類當作方法直接轉換。

Number([]);        //0
String([]);        //''
Boolean([]);       //true

還有更簡單的轉換方法。

3 + ''    // 字符串'3'
+'3'      // 數字3
!!'3'     // true

本次給大家推薦一個免費的學習圈,裏面概括移動應用網站開發,css,html,webpack,vue node angular以及面試資源等。獲取資料👈👈👈
對web開發技術感興趣的同學,歡迎加裙:👉👉👉582735936 👈👈👈,不管你是小白還是大牛我都歡迎,還有大牛整理的一套高效率學習路線和教程與您免費分享,同時每天更新視頻資料。
最後,祝大家早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章