首頁 > web前端 > js教程 > 淺談JavaScript的隱式型別轉換

淺談JavaScript的隱式型別轉換

黄舟
發布: 2017-03-15 14:53:24
原創
1493 人瀏覽過

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

typeof '11'  //string       
typeof(11)  //number
&#39;11&#39; < 4     //false
登入後複製

基本型別的轉換

下面先講加減乘除:

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

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

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

//隐式转换 + - * == / 
// + 
10 + &#39;20&#39;    //2010
// -
10 - &#39;20&#39;    //-10
10 - &#39;one&#39;   //NaN
10 - &#39;100a&#39;  //NaN
// *
10*&#39;20&#39;      //200
&#39;10&#39;*&#39;20&#39;    //200
// /
20/&#39;10&#39;      //2
&#39;20&#39;/&#39;10&#39;    //2
&#39;20&#39;/&#39;one&#39;  //NaN
登入後複製

再來看看一組 == 的。

1.undefined等於null

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

3.數字為布林比較時,布林轉數字

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

// ==
undefined == null;    //true
&#39;0&#39; == 0;            //true,字符串转数字
0 == false;           //true,布尔转数字
&#39;0&#39; == false;       //true,两者转数字
null == false;       //false
undefined == false;  //false
登入後複製

引用型別的轉換

基本型別間的比較相對簡單。引用型別和基本型別的比較就相對複雜一些,先要把引用型別轉成基本型,再用上述的方法比較。引用類型轉布爾全是true。例如空陣列,只要是物件就是引用類型,所以[]為true。引用型別轉數字或字串就要用valueOf()或toString();物件本身就繼承了valuOf()和toString(),還可以自訂valueOf()和toString()。根據不同的物件用繼承的valueOf()轉成字串,數字或本身,而物件用toString就一定轉為字串。一般物件預設呼叫valueOf()。

1.物件轉數字時,呼叫valueOf();

2.物件轉字串時,呼叫toString();

先看看下面的範例:

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

[] == ![];      //true, [].valueOf() == !Boolean([]) -> 0 == false -> 0 == 0;
登入後複製

物件轉成數字時,呼叫valueOf(),在這之前先呼叫的是toString();所以我猜valueOf方法是這樣的。 So上面的範例 0 == []要改成下面比較合理。無論如何,[]最後是轉成0的。

var valueOf = function (){
    var str = this.toString();    //先调用toString(),转成字符串
    //...
}
0 == [];        // true, 0 == [].valueOf(); -> 0 == &#39;0&#39; -> 0 == 0;
登入後複製

自訂的valueOf()和toString();

1.自訂的valueOf()和toString()都存在,會預設呼叫valueOf();

2.如果只有toString(),則呼叫toString();

var a = [1];

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

a + 1;         // 2, valueOf()先调用
登入後複製

去掉valueOf()就會呼叫toString()。

var a = [1];

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

a + 1;         // 2, 先调用valueOf()
//去掉valueOf
delete a.valueOf;
a + 1;        // &#39;11&#39;, 调用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([]);        //&#39;&#39;
Boolean([]);       //true
登入後複製

還有更簡單的轉換方法。

3 + &#39;&#39;    // 字符串&#39;3&#39;
+&#39;3&#39;      // 数字3
!!&#39;3&#39;     // true
登入後複製

以上是淺談JavaScript的隱式型別轉換的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板