JavaScript的資料型別分為六種,分別為null,undefined,boolean,string,number,object。 object是引用型,其它的五種是基本型別或是原始型別。我們可以用typeof方法列印來某個是屬於哪個類型的。不同類型的變數比較要先轉類型,叫做型別轉換,型別轉換也叫隱式轉換。隱式轉換通常發生在運算子加減乘除,等於,還有小於,大於等。 。
typeof '11' //string typeof(11) //number '11' < 4 //false
本章節單獨介紹一下javascript中的隱式資料型別轉換,對於它的良好掌握,在實際應用能夠簡化很多操作。
看如下程式碼實例:
var arr = [5]; console.log(arr+"");
上面的程式碼就是將陣列隱式轉換成字串的一個操作,是不是要比下面的方式要簡單不少:
var arr = [5]; console.log(arr.toString());
像上面類似的隱式資料型別轉換在實際編碼上應用很多,下面進入正題。
一.值型之間的資料型別轉換:
javascript中的資料型態可以參考javascript資料型別詳解一章節。
(1).數字和字串使用+運算子:
數字和字串如果使用+運算子進行操作,那麼會將數字先轉換為字串,然後進行字串連接操作:
var antzone = "antzone"; var num = 8; console.log(antzone+num);
(2).布林值參與的+運算子運算:
如果有布林型參與,那麼首先會將布林值轉換為對應的數字或字串,然後再進行對應的字串連接或算數運算。
var bool = true; var num = 8; console.log(bool + num);
上面的程式碼是先將true轉換成數字1,然後再進行算數加運算。
var bool = true; var num = "8"; console.log(bool + num);
上面的布林值會轉換為對應的字串形式"true",然後再進行字串連接。
(3).減法操作:
如果進行減法操作,那麼兩個操作數都會先轉換成數字,然後在進行算數運算:
var bool = true; var num = "8"; console.log(bool - num);
true會轉換為數字1,字串"8"會轉換為數字8,然後進行算術運算。
乘,除,大於,小於跟減的轉換也是一樣,就不再舉例子了。
(4).==等性運算:
undefined和null比較特殊,它們兩個使用==運算子回傳值是true。
console.log(undefined==null);
其他值類型進行比較的時候都會將運算數轉換為數字
console.log("3"==3);
上面的程式碼會將字串"3"轉換成數字,然後再進行比較。
console.log("1"==true);
上面的程式碼會分別將"1"和true轉換成數字,然後進行比較。
二.引用型別轉值型別:
引用型別(物件)轉換為值型別則複雜很多,以下分佈展開介紹。
物件繼承的兩個方法可以幫助我們實現物件到值類型的轉換功能:
(1).toString()方法。
(2).valueOf()方法。
通常情況下我們認為,將一個物件轉換為字串要呼叫toString()方法,轉換為數字要呼叫valueOf()方法,但是真正應用的時候並沒有這麼簡單,看如下程式碼實例:
var obj = { webName: "脚本之家", url:"softwhy.com" } console.log(obj.toString());
從上面的程式碼可以看出,toString()方法並沒有將物件轉換為一個能夠反映此物件的字串。
var arr = [1, 2, 3]; console.log(arr.valueOf());
從上面的程式碼可以看出,valueOf()方法並沒有將物件轉換為能夠反映此物件的一個數字。
var arr = [1, 2, 3]; console.log(arr.toString());
数组对象的toString()方法能够将数组转换为能够反映此数组对象的字符串。
总结如下:
(1).有些对象只是简单继承了toString()或者valueOf()方法,比如第一个例子。
(2).有些对象则不但是继承了两个方法,而且还进行了重写。
所以有些对象的方法能够达成转换成字符串或者数字的目标,有些则不能。
调用toString()或者valueOf()将对象转换成字符串或者数字的规则如下:
调用toString()时,如果对象具有这个方法,则调用此方法;如果此方法返回一个值类型数据,那么就返回这个值类型数据,然后再根据所处的上下文环境进行相关数据类型转换。如果没有toString(),或者此方法返回值并不是一个值类型数据,那么就会调用valueOf()(如果此方法存在的话),如果valueOf()返回一个值类型数据,那么再根据所处的上下文环境进行相关的数据类型转换。
进一步说明:
(1).上面介绍了通常默认情况下valueOf()和toString()方法的作用(将对象转换为数字或者字符串),但是需要注意的是,这并不是硬性规定,也就是说并不是valueOf()方法必须要返回数字或者toString()方法必须要转换为字符串,比如简单继承的这两个方法就无法进行实现转换为数字和字符串的功能,再比如,我们可以自己称谢这两个方法,返回值也没有必要是数字或者字符串。
(2).还有需要特别注意的一点就是,很多朋友认为,转换为字符串首先要调用toString()方法, 其实这是错误的认识,我们应该这么理解,调用toString()方法可以转换为字符串,但不一定转换字符串就是首先调用toString()方法。
看如下代码实例:
var arr = []; arr.valueOf = function () { return "1"; } arr.toString = function () { return "2"; } console.log(arr + "1");
上面的代码中,arr是要被转换为字符串的,但是很明显是调用的valueOf()方法,而没有调用toString()方法。有些朋友可能会有这样的质疑,难道[2]这样的数字转换成字符串"2",不是调用的toString()方法吗。
代码如下:
var arr = [2]; console.log(arr + "1");
其实过程是这样的,首先arr会首先调用valueOf()方法,但是数字的此方法是简单继承而来,并没有重写(当然这个重写不是我们实现),返回值是数组对象本身,并不是一个值类型,所以就转而调用toString()方法,于是就实现了转换为字符串的目的。
总结如下:
大多数对象隐式转换为值类型都是首先尝试调用valueOf()方法。但是Date对象是个例外,此对象的valueOf()和toString()方法都经过精心重写,默认是调用toString()方法,比如使用+运算符,如果在其他算数运算环境中,则会转而调用valueOf()方法。
代码实例如下:
var date = new Date(); console.log(date + "1"); console.log(date + 1); console.log(date - 1); console.log(date * 1);
以上内容是小编给大家介绍的JavaScript数据类型之隐式类型转换的全部内容,希望大家喜欢。