avaScript的數據類型分爲六種,分別爲null,undefined,boolean,string,number,object。object是引用類型,其它的五種是基本類型或者是原始類型。咱們能夠用typeof方法打印來某個是屬於哪一個類型的。不一樣類型的變量比較要先轉類型,叫作類型轉換,類型轉換也叫隱式轉換。隱式轉換一般發生在運算符加減乘除,等於,還有小於,大於等。。javascript
typeof '11' //string typeof(11) //number '11' < 4 //false
下面先講加減乘除:css
1.字符串加數字,數字就會轉成字符串。html
2.數字減字符串,字符串轉成數字。若是字符串不是純數字就會轉成NaN。字符串減數字也同樣。兩個字符串相減也先轉成數字。vue
3.乘,除,大於,小於跟減的轉換也是同樣。java
//隱式轉換 + - * == / // + 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
再來看看一組 == 的。node
1.undefined等於nullwebpack
2.字符串和數字比較時,字符串轉數字web
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,快速升職加薪,走上人生巔峯。