js的數據類型和常見隱式轉化邏輯。javascript
原始類型(基本類型):按值訪問,能夠操做保存在變量中實際的值。原始類型彙總中null和undefined比較特殊。html
引用類型:引用類型的值是保存在內存中的對象。java
* 與其餘語言不一樣的是,JavaScript不容許直接訪問內存中的位置,也就是說不能直接操做對象的內存空間。在操做對象時,其實是在操做對象的引用而不是實際的對象。因此引用類型的值是按引用訪問的。數組
巧用+和-規則轉換類型app
把變量轉換成數字:num-0;函數
把變量轉換成字符串:num+'';學習
類型相同,同===網站
類型不一樣,嘗試類型轉換和比較:spa
類型不一樣,返回falseprototype
類型相同:
基本類型中的number,string和boolean都有對應的包裝類型。
把一個基本類型嘗試用對象的方式使用它的時候,好比訪問length屬性,或者增長一些屬性的操做時,javascript會把這些基本類型轉化爲對應的包裝類型對象。完成這樣一個訪問好比a.length返回之後或者a.t設置了之後,這個臨時對象會被銷燬掉。因此a.t賦值3了之後,再去輸出a.t值是undefined。
str,number和true都有包裝類型,因此能夠把數字用括號括起來調用toString()方法
javascript中類型檢測方法有不少:
最多見的就是typeof:
比較特殊的是typeof null返回「object」。
歷史緣由,規範嘗試修改typeof null返回「null」修改完大量網站沒法訪問,爲了兼容,或者說歷史緣由返回"object"。
typeof對基本類型和函數對象很方便,可是其餘類型就沒辦法了。
判斷一個對象是否是數組?用typeof返回「object」。對對象的判斷經常使用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!
須要注意的是IE6/7/8中 Object.prototype.toString.apply(null)返回「[object Object]」。
任何對象都有constructor屬性,繼承自原型的,constructor會指向構造這個對象的構造器或者構造函數。
constructor能夠被改寫,因此使用要當心。
好比不知道一個對象是否是數組,能夠判斷它的length是否是數字,它是否是有join,push這樣一些數組的方法。經過一些特徵判斷對象是否屬於某些類型,這個有時候也經常使用。
總結:
有另一種方法:將變量和空字符拼接後再和原來變量作全等判斷
var str="hello"; var temp=str+''; temp===str //true
本文做者starof,因知識自己在變化,做者也在不斷學習成長,文章內容也不定時更新,爲避免誤導讀者,方便追根溯源,請諸位轉載註明出處:http://www.cnblogs.com/starof/p/6368048.html有問題歡迎與我討論,共同進步。