js的數(shù)據(jù)類型分為兩大類:
值類型(基本類型):字符串(String)、數(shù)字(Number)牍疏、布爾(Boolean)菩收、對空(Null)、未定義(Undefined)鬓椭、Symbol。
引用數(shù)據(jù)類型:對象(Object)关划。
基本類型:也稱為簡單類型小染,由于其占據(jù)空間固定,是簡單的數(shù)據(jù)段贮折,為了便于提升變量查詢速度裤翩,將其存儲(chǔ)在棧中,即按值訪問调榄。
引用類型:也稱為復(fù)雜類型踊赠,由于其值的大小會(huì)改變,所以不能將其存放在棧中每庆,否則會(huì)降低變量查詢速度筐带,因此,其值存儲(chǔ)在堆中缤灵,而存儲(chǔ)在變量處的值伦籍,是一個(gè)指針,指向存儲(chǔ)對象的內(nèi)存處腮出,即按址訪問帖鸦。引用類型除 Object 外,還包括 Function 胚嘲、Array作儿、RegExp、Date 等等馋劈。
引用類型和基本類型的區(qū)別:
1攻锰、基本類型按值訪問
2、引用類型按址訪問
判斷類型的幾種方式
typeof
需要注意的是:
- 基本類型除了null返回了object侣滩,其他都返回正確
- 引用類型除了function口注,其他都返回object
其中,null 有屬于自己的數(shù)據(jù)類型 Null 君珠, 引用類型中的 數(shù)組寝志、日期、正則 也都有屬于自己的具體類型,而 typeof 對于這些類型的處理材部,只返回了處于其原型鏈最頂端的 Object 類型毫缆,沒有錯(cuò),但不是我們想要的結(jié)果乐导。
instanceof
A instanceof B用來判斷A是否屬于B的實(shí)例苦丁,返回true或者false。
需要注意的是:
- [ ]既是arrray的實(shí)例物臂,也是object的實(shí)例旺拉,[ ].__proto__指向 Array.prototype,而 Array.prototype.proto 又指向了Object.prototype棵磷,Object.prototype.__proto__ 指向了null蛾狗,然后原型鏈結(jié)束,[ ]仪媒、Array沉桌、Object 就在內(nèi)部形成了一條原型鏈
image.png
ES5中可以用Array.isArray([])來準(zhǔn)確判斷數(shù)組的實(shí)例
- instanceof 只能用來判斷兩個(gè)對象是否屬于實(shí)例關(guān)系, 而不能判斷一個(gè)對象實(shí)例具體屬于哪種類型算吩。
constructor
當(dāng)創(chuàng)建變量b時(shí)留凭,js會(huì)在b的原型上添加constructor屬性,指向b的引用
js在創(chuàng)建內(nèi)置對象時(shí)偎巢,也是這么做的:
需要注意的是:
- null和undefiend是無效的蔼夜,因此沒有constructor存在
- 程序員重寫對象的prototype 后,原有的 constructor 引用會(huì)丟失艘狭,造成判斷不準(zhǔn)確
Object.prototype.toString
Object對象有tostring方法返回:
而非object對象挎扰,則需要call/apply才能正確返回類型,返回格式為字符串類型的"[object 數(shù)據(jù)類型xxx]":
以上幾種方式可以在不同場景使用巢音。