JavaScript中數據類型和類型判斷

數據類型

首先明確ECMAscript中的數據類型分為兩種贝或,基本類型(7鐘)和引用類型(1種)

基本類型:(又稱簡單數據類型)7種,未定義類型(Undefined)试溯,對空類型(Null)的畴,布爾類型(Boolean),數字類型(Number)节仿,字符串(String),符號類型(Symbol)掉蔬,BigInt廊宪;都是按值訪問的,即將一個基本類型的數據賦值給另外一個變量女轿,是將元數據拷貝一份賦值的箭启,兩變量之間互不影響。

引用類型:引用類型的值(對象)是應用類型的一個實例蛉迹,在ECMAScript中傅寡,應用類型是一種數據結構,用于將數據和功能綁定在一起。它也常被稱為類荐操,雖然這種稱呼并不妥當芜抒。引用類型有時候也被稱為對象定義,因為它描述的是一類對象所具有的屬性和方法托启。 除過對象類型都是引用類型宅倒,即保存在內存中的對象,按引用訪問屯耸,即將一個引用類型的地址賦值給另一個變量拐迁,這兩個變量的值是相同的相當于指針,都指向同一塊內存空間疗绣, 操作該變量等于操作該變量指向的內存空間的值唠亚,當其中一個變量改變時,原變量也會隨之改變持痰。如Object灶搜,Function,Date工窍,RegExp割卖,Array, Map患雏,Set........但是Object是引用變量的本質

小可耐們注意啦~~~ 引用類型與基本包裝類型的主要區(qū)別就是對象的生存期鹏溯。使用new操作符創(chuàng)建的引用類型的實例,在執(zhí)行流離開當前作用域之前都一直保存在內存中淹仑。而自動創(chuàng)建的基本包裝類型的對象丙挽,則只存在于一行代碼的執(zhí)行瞬間,然后立即被銷毀匀借。這意味著我們不能在運行時為基本包裝類型添加屬性和方法颜阐。


類型對比

基本類型主要是把值存儲在內存中;基礎類型賦值會重新創(chuàng)建一個基礎值;它們的值直接存儲在變量訪問的位置吓肋。這是因為這些原始類型占據的空間是固定的凳怨,所以可將他們存儲在較小的內存區(qū)域 – 棧中。這樣存儲便于迅速查尋變量的值是鬼。

引用類型把值存儲在內存中肤舞,堆內存的地址存儲在棧內存中;引用類型賦值只是把堆內存的地址賦值給新變量.也就是說均蜜,存儲在變量處的值是一個指針(point)李剖,指向存儲對象的內存地址。這是因為:引用值的大小會改變囤耳,所以不能把它放在棧中篙顺,否則會降低變量查尋的速度偶芍。相反,放在變量的椢堪玻空間中的值是該對象存儲在堆中的地址。地址的大小是固定的聪铺,所以把它存儲在棧中對變量性能無任何負面影響化焕。

堆和棧有啥區(qū)別?

堆:堆為隊列優(yōu)先铃剔,先進先出(FIFO)撒桨,使用二級緩存,生命周期與虛擬機的GC算法有關(并不是引用為空就立即被GC)键兜,調用速度相對較低凤类。

棧:棧為先進后出(FILO),使用一級緩存普气,被調用時通常處于存儲空間中谜疤,調用后被立即釋放。


變量類型判斷

1.?使用typeof檢測

格式: typeof? 變量名

返回值:‘number’现诀,‘string’夷磕,‘boolean’,‘undefined’仔沿,‘symbol’, ‘object’坐桩,只有這六種返回類型,剩下均被檢測為‘object’封锉。

注意:而且typeof null === 'object' (JS 設計初的bug)

總結:簡單绵跷,對基礎類型檢測性能好;

2. 使用instanceof檢測

格式:變量名? instanceof? 數據類型

判斷參照對象(引用類型)的prototype屬性所指向的對象書否在被行測對象的原型鏈上成福,比如?

class Person{

? ? constructor(name) {

? ? ? ? this.name = name;

? ? }

?}

let p? = new Person("張三")碾局;

按照描述就是Person的prototype屬性所指向的原型對象是否存在于p的原型鏈中。

這種判斷方式奴艾,undefined和null被檢測為object

總結:能檢測出引用類型擦俐;不能檢測出基本類型;

3. 使用constructor檢測

constructor本來是原型鏈上的屬性握侧,指向構造函數蚯瞧,但是根據實例對象尋找屬性的順序,若實例對象上沒有實例屬性或方法品擎,就去原型鏈上尋找埋合,因此,實例對象也是能夠使用constructor屬性的萄传。

除了undefined和null甚颂,其他類型的變量均能使用constructor判斷出類型蜜猾,只不過使用constructor是不保險的,因為constructor屬性是可以被修改的振诬,會導致檢測出的結果不正確蹭睡。比如

function f() { }

f.prototype = new Array();

let ff = new f();

console.log(ff.constructor==true);? //true

使用instanceof和constructor,被判斷的array必須是當前頁面聲明的赶么,比如肩豁,一個頁面(父頁面)有一個框架,框架中引用了一個頁面(子頁面)辫呻,在子頁面中生命了一個Array清钥,并將其賦值給父頁面的一個變量,這是判斷該變量放闺,Array == object.constructor;會返回false祟昭;

原因:

1、array屬于引用型數據怖侦,在傳遞過程中篡悟,僅僅是引用地址的傳遞。

2匾寝、instanceof操作符是假定只有一個全局執(zhí)行環(huán)境恰力,如果網頁中包含多個框架,就會存在兩個以上不同的全局執(zhí)行環(huán)境旗吁,從而存在兩個以上不同版本的Array構造函數踩萎。如果你從一個框架向另一個框架傳入一個數組,那么傳入的數組與在第二個框架中原生創(chuàng)建的數組分別具有各自不同的構造函數很钓。

????為了解決這個問題香府,可以使用ES5中新增的方法 Array.isArray() 方法,這個方法的目的是最終確定某個值到底是不是數組码倦,而不管它是在哪個全局執(zhí)行環(huán)境中創(chuàng)建的企孩。

總結:基本能檢測所有的類型(除了null和undefined);constructor易被修改,不可靠

4.使用Object.prototype.toString.call()檢測

ECMA對Object.prototype.toString的解釋:

Object.prototype.toString( )

When the toString method is called, the following steps are taken:

1. Get the [[Class]] property of this object. 獲取對象的類名(對象類型)

2. Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.? 然后將[object? 獲取的類名] 組合

3. Return Result? ?返回組合結果

這種方式解決了instanceof存在的跨頁面問題袁稽,也解決了屬性檢測方式所存在的問題勿璃,nice~~~~

總結:所有類型都能檢測;寫起來比較繁瑣推汽,性能不如 typeof 好补疑;


例子

下面定義了常見的變量類型

let num = 7;? ? ? ? ?let num2 = new Number(7);

let str = "hello";? ? ? let str2 = new String("hello");

let boo = true;? ? ? ?let boo2 = new Boolean(true);

let arr = [1, 2, 3, 4];

let json = { name: "dingdang", age:20};

let func = function() {console.log("this is function")};

let und = undefined;

let nul = null;

let date = new Date();

let reg = /^[a-zA-Z]{5,20}$/;

let error = new Error();

let map = new Map([ ['name', '張三'], ['title', 'Author']]);

let set = new Set(['red', 2, 'blue', 4]);

運行結果見下圖:

寬寬的圖

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?~~~~~聽大神說寫博客可以成為小仙女~~~~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市歹撒,隨后出現的幾起案子莲组,更是在濱河造成了極大的恐慌,老刑警劉巖暖夭,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锹杈,死亡現場離奇詭異撵孤,居然都是意外死亡,警方通過查閱死者的電腦和手機竭望,發(fā)現死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門邪码,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咬清,你說我怎么就攤上這事闭专。” “怎么了枫振?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵喻圃,是天一觀的道長萤彩。 經常有香客問我粪滤,道長,這世上最難降的妖魔是什么雀扶? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任杖小,我火速辦了婚禮,結果婚禮上愚墓,老公的妹妹穿的比我還像新娘予权。我一直安慰自己,他們只是感情好浪册,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布扫腺。 她就那樣靜靜地躺著,像睡著了一般村象。 火紅的嫁衣襯著肌膚如雪笆环。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天厚者,我揣著相機與錄音躁劣,去河邊找鬼。 笑死库菲,一個胖子當著我的面吹牛账忘,可吹牛的內容都是我干的。 我是一名探鬼主播熙宇,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼鳖擒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了烫止?” 一聲冷哼從身側響起败去,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烈拒,沒想到半個月后圆裕,有當地人在樹林里發(fā)現了一具尸體广鳍,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年吓妆,在試婚紗的時候發(fā)現自己被綠了赊时。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡行拢,死狀恐怖祖秒,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情舟奠,我是刑警寧澤竭缝,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站沼瘫,受9級特大地震影響抬纸,放射性物質發(fā)生泄漏。R本人自食惡果不足惜耿戚,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一湿故、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧膜蛔,春花似錦坛猪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至呜呐,卻和暖如春就斤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卵史。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工战转, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人以躯。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓槐秧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忧设。 傳聞我的和親對象是個殘疾皇子刁标,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,131評論 0 13
  • 1.通過typeof可以判斷處幾種基本數據類型Boolean,number,string,null,undefin...
    舟漁行舟閱讀 630評論 0 1
  • 我的媽媽是個既溫柔又暴躁的媽媽址晕。一雙彎彎的眉毛下有一雙黑寶石般的大眼睛膀懈,挺挺的鼻子下有一張能說會道的小嘴,一頭烏黑...
    王佳睿閱讀 203評論 0 1
  • 固體制劑 散劑 特點 1粒徑小谨垃,比表面積大启搂,易分散和起效快 2外用覆蓋面積大硼控,兼具保護,收斂等作用 3制備工藝簡單...
    瑩濤_石頭記閱讀 529評論 0 0
  • 小曉是個很內向的姑娘胳赌,因為內向而不自信牢撼,不敢爭不敢搶,在公司里也是最低級的存在疑苫。好像誰都可以指示她熏版,哪怕這些事本就...
    萵筍姑娘閱讀 429評論 0 1