JavaScript的隱式型別轉換淺析
JavaScript的資料型別分為六種,分別為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();
先看看下面的例子:
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的。
var valueOf = function (){ var str = this.toString(); //先呼叫toString(),轉成字串 //... } 0 == []; // true, 0 == [].valueOf(); -> 0 == '0' -> 0 == 0;
自定義的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
相關文章
- JavaScript 隱性型別轉換步驟淺析JavaScript型別
- JavaScript隱式型別轉換JavaScript型別
- 有趣的JavaScript隱式型別轉換JavaScript型別
- JavaScript 隱式資料型別轉換JavaScript資料型別
- JavaScript隱式型別轉換趣解JavaScript型別
- 「譯」JavaScript 的怪癖 1:隱式型別轉換JavaScript型別
- 【關於Javascript】--- 隱式型別轉換篇JavaScript型別
- 淺談JavaScript的型別轉換JavaScript型別
- MySQL 隱式型別轉換MySql型別
- javascript中隱私型別轉換JavaScript型別
- C++隱式型別的轉換C++型別
- 資料型別的隱式轉換資料型別
- javascript資料型別隱式和顯式轉換詳解JavaScript資料型別
- javascript 隱式資料型別轉換程式碼例項JavaScript資料型別
- Java資料型別的顯式轉換和隱式轉換Java資料型別
- C語言的隱式型別轉換C語言型別
- javascript運算中的隱式型別轉換簡單介紹JavaScript型別
- C# 隱式型別轉換(轉載)C#型別
- 如何實現隱式型別轉換型別
- 談談 MySQL 隱式型別轉換MySql型別
- C++隱式類型別轉換C++型別
- C++ 隱式類型別轉換C++型別
- 索引失效系列——隱式型別轉換索引型別
- JavaScript 運算子規則與隱式型別轉換詳解JavaScript型別
- javascript 隱式轉換JavaScript
- 淺談Oracle中隱式型別轉換規律和影響Oracle型別
- c++隱式型別轉換存在的陷阱C++型別
- 建構函式定義的隱式型別轉換函式型別
- 徹底理解c++的隱式型別轉換C++型別
- 資料型別隱式轉換導致的阻塞資料型別
- ORACLE中的隱式資料型別轉換(一)Oracle資料型別
- JavaScript 型別轉換JavaScript型別
- Oracle隱式型別轉換導致索引失效Oracle型別索引
- 33 個 JavaScript 核心概念系列(三): 顯式 (名義) 與 隱式 (鴨子)型別轉換JavaScript型別
- 從Java的型別轉換看MySQL和Oracle中的隱式轉換(二)Java型別MySqlOracle
- oracle資料型別隱式轉換----- 應急方案Oracle資料型別
- 欄位的資料型別隱式轉換有關係資料型別
- SQL Server中datetimeset轉換datetime型別問題淺析SQLServer型別