js的數據類型和常見隱式轉化邏輯。
一、六種數據類型
原始類型(基本類型):按值訪問,可以操作保存在變量中實際的值。原始類型匯總中null和undefined比較特殊。
引用類型:引用類型的值是保存在內存中的對象。
* 與其他語言不同的是,JavaScript不允許直接訪問內存中的位置,也就是說不能直接操作對象的內存空間。在操作對象時,實際上是在操作對象的引用而不是實際的對象。所以引用類型的值是按引用訪問的。
二、隱式轉換
1、+和-
巧用+和-規則轉換類型
把變量轉換成數字:num-0;
把變量轉換成字符串:num+'';
2、a==b
類型相同,同===
類型不同,嘗試類型轉換和比較:
3、a===b
類型不同,返回false
類型相同:
三、包裝對象
基本類型中的number,string和boolean都有對應的包裝類型。
把一個基本類型嘗試用對象的方式使用它的時候,比如訪問length屬性,或者增加一些屬性的操作時,javascript會把這些基本類型轉化為對應的包裝類型對象。完成這樣一個訪問比如a.length返回以后或者a.t設置了以后,這個臨時對象會被銷毀掉。所以a.t賦值3了以后,再去輸出a.t值是undefined。
str,number和true都有包裝類型,所以可以把數字用括號括起來調用toString()方法
四、類型檢測
javascript中類型檢測方法有很多:
- typeof
- instanceof
- Object.prototype.toString
- constructor
- duck type
1、typeof
最常見的就是typeof:
比較特殊的是typeof null返回“object”。
歷史原因,規范嘗試修改typeof null返回“null”修改完大量網站無法訪問,為了兼容,或者說歷史原因返回"object"。
typeof對基本類型和函數對象很方便,但是其他類型就沒辦法了。
判斷一個對象是不是數組?用typeof返回“object”。對對象的判斷常用instanceof。
2、instanceof
基於原型鏈操作。obj instanceof Object。
左操作數為對象,不是就返回false,右操作數必須是函數對象或者函數構造器,不是就返回typeError異常。
原理:判斷左邊的左操作數的對象的原型鏈上是否有右邊這個構造函數的prototype屬性。
任何一個構造函數都有一個prototype對象屬性,這個對象屬性將用作new出來的對象的原型。
bosn instanceof Person的時候發現bosn的原型也就是Student.prototype不等於Person.prototype,所以原型鏈還會向上查找,bosn的原型的原型等於Person.prototype所以返回true。
instanceof在判斷對象是不是數組,Data,正則等時很好用。
instanceof坑:不同window或iframe之間的對象類型檢測不能使用instanceof!
3、Object.prototype.toString
需要注意的是IE6/7/8中 Object.prototype.toString.apply(null)返回“[object Object]”。
4、constructor
任何對象都有constructor屬性,繼承自原型的,constructor會指向構造這個對象的構造器或者構造函數。
constructor可以被改寫,所以使用要小心。
5、duck type
比如不知道一個對象是不是數組,可以判斷它的length是不是數字,它是不是有join,push這樣一些數組的方法。通過一些特征判斷對象是否屬於某些類型,這個有時候也常用。
總結:
6、如何檢測一個變量是字符串
有另外一種方法:將變量和空字符拼接后再和原來變量做全等判斷
var str="hello"; var temp=str+''; temp===str //true