摘要:每當(dāng)讀取這個(gè)基本類(lèi)型時(shí),后臺(tái)會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的基本包裝類(lèi)型的對(duì)象。類(lèi)型判斷主要是用來(lái)判斷基本數(shù)據(jù)類(lèi)型返回類(lèi)型新增所以只能用來(lái)判斷基本數(shù)據(jù)類(lèi)型。引用類(lèi)型基本包裝類(lèi)型都會(huì)返回。
最近重溫JS高程設(shè)計(jì)以及與朋友的討論。決定趁熱打鐵記錄JS的各種類(lèi)型,并做下深入總結(jié)。
js的幾種類(lèi)型基本類(lèi)型:Boolean、String、Number、Null、Undefined
引用類(lèi)型:
2.1 Object、Array、Date、RegExp等
2.2 基本包裝類(lèi)型:Boolean、String、Number
就是我們平常用來(lái)做簡(jiǎn)單賦值的類(lèi)型。這種數(shù)據(jù)類(lèi)型是存在棧中以值得形式存在,賦值時(shí)也是直接進(jìn)行值傳遞
引用類(lèi)型是高級(jí)的類(lèi)型,可以添加方法和熟悉等。真正的數(shù)據(jù)存在堆中,賦值時(shí)是進(jìn)行址傳遞
//舉個(gè)例子 var a = [3,4,5]; var b = a;//賦值的是 存儲(chǔ) a變量的地址。這時(shí)候a、b指向同一片內(nèi)存區(qū)域 b[0] = 9;//改變內(nèi)存區(qū)域中的值 a的值也進(jìn)行更改 console.log(a);//[9,4,5]基本包裝類(lèi)型介紹
我們都知道只有引用類(lèi)型才能添加、調(diào)用屬性和方法,那為什么基本類(lèi)型Boolean、String、Number能調(diào)用方法?按說(shuō)它是沒(méi)有方法才對(duì)呀!這是因?yàn)镋CMAScript提供了三個(gè)特殊的包裝類(lèi)型:Boolean、String、Number。每當(dāng)讀取這個(gè)基本類(lèi)型時(shí),后臺(tái)會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的基本包裝類(lèi)型的對(duì)象。使得可以操作這個(gè)基本類(lèi)型了。
當(dāng)我們?cè)趦?nèi)存中讀取基本類(lèi)型時(shí),后臺(tái)會(huì)做以下操作:1.創(chuàng)建對(duì)應(yīng)包裝類(lèi)型(Boolean、String、Number)的實(shí)例
2.在實(shí)例上調(diào)用對(duì)應(yīng)的方法
3.銷(xiāo)毀這個(gè)實(shí)例
//舉個(gè)實(shí)際操作的例子 var str = "have a good time"; var str2 = str.charAt(0);//h; str.color = "red"; console.log(str.color);//undefined
這是因?yàn)橐妙?lèi)型和基本包裝類(lèi)型的生存期不一樣。引用類(lèi)型在執(zhí)行流離開(kāi)當(dāng)前作用域時(shí)一直存在內(nèi)存中。自動(dòng)創(chuàng)建的基本包裝類(lèi)型的對(duì)象,只存在于執(zhí)行這一行代碼的一瞬間,執(zhí)行完立馬被銷(xiāo)毀了。這就是為什么我們給str.color添加對(duì)象時(shí)打印出來(lái)為undefined。因?yàn)樵趫?zhí)行完str的color這一行代碼時(shí),自動(dòng)創(chuàng)建的包裝類(lèi)型對(duì)象被銷(xiāo)毀了。下面console出來(lái)的str是新創(chuàng)建的String對(duì)象,沒(méi)有color這個(gè)屬性。
js類(lèi)型判斷
typeof 主要是用來(lái)判斷基本數(shù)據(jù)類(lèi)型
//返回類(lèi)型: string、number、boolean、object、undefined、function、Symbol(ES6新增) typeof 123; // "number" typeof "cherry";// "string" typeof false; //"boolean" typeof undefined; //"undefined" typeof null; // "object" typeof {name:"cherry"};//"object" var fun = function(){}; typeof fun; //"function" typeof new String("xxx");//"object"
所以typeof只能用來(lái)判斷基本數(shù)據(jù)類(lèi)型。null、引用類(lèi)型、基本包裝類(lèi)型都會(huì)返回object。
instanceof 用法:A instanceof B,主要是判斷A是否是某個(gè)對(duì)象的實(shí)例,簡(jiǎn)單來(lái)說(shuō)就是A的原型鏈上(__proto__)是否有B的原型對(duì)象(prototype)。
// 例子 var obj= {"name":"cherry"}; obj instanceof Object; //true var strObj = new String("hello"); strObj instanceof String;//true var str = "hello"; str instanceof String;//false
//判斷的原理 就是計(jì)算逐級(jí)計(jì)算左邊對(duì)象的__proto__是否等于右邊對(duì)象的prototype即可 function instance(left,right){ var obj = right.prototype; var left = left.__proto__; while(true){ if(left === null){ return false; } if(left == obj){ return true; } left = left.__proto__; } }
Object.prototype.toString.call()(點(diǎn)擊看此方法具體原理)
Object.toString()返回對(duì)象的字符串表示。但是由于數(shù)值、布爾、字符串、數(shù)組都有重寫(xiě)toString方法,直接調(diào)用的時(shí)候使用的是自身原型對(duì)象上有toString方法則不會(huì)往上去找Object的toString方法。這里強(qiáng)制使用Object原型對(duì)象上的toString方法。
Object.prototype.toString.call("123");//[object String] var objStr = new String("123");//包裝類(lèi)型檢測(cè)出來(lái)也是對(duì)應(yīng)類(lèi)型而不是對(duì)象 Object.prototype.toString.call(objStr);//[object String] Object.prototype.toString.call(123);//[object Number] Object.prototype.toString.call(true);//[object Boolean] Object.prototype.toString.call(null);//[object Null] Object.prototype.toString.call(undefined);//[object Undefined] var obj = {"name":"cherry"}; Object.prototype.toString.call(obj);//[object Object] var arr = [1,2,3]; Object.prototype.toString.call(arr);//[object Array]
總結(jié):使用Object的toString(),可以檢測(cè)出各值的類(lèi)型?;緮?shù)據(jù)類(lèi)型和基本包裝類(lèi)型返回的值是一樣。所以不用擔(dān)心別人是通過(guò)基本包裝類(lèi)型定義的變量(面試時(shí)被問(wèn)過(guò))
面試題:判斷一個(gè)值的數(shù)據(jù)類(lèi)型
function valueType(data){ var type = null; var typeList = ["Object","Number","Boolean","String","Function","Object","Null","Undefined"]; for(var item of typeList){ if(Object.prototype.toString.call(str) == `[object ${item}]`){ type = item; break; } } return type; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/104961.html
摘要:基本類(lèi)型引用類(lèi)型等,說(shuō)白了就是對(duì)象。。?;景b類(lèi)型如下基本類(lèi)型毫無(wú)疑問(wèn)上面的是一個(gè)基本類(lèi)型,但是它卻能召喚出一個(gè)的方法,這是什么原因呢主要是因?yàn)樵诨绢?lèi)型中,有三個(gè)比較特殊的存在就是,這三個(gè)基本類(lèi)型都有自己對(duì)應(yīng)的包裝對(duì)象。 基本類(lèi)型:Undefined,Null,Boolean,Number,String 引用類(lèi)型:Object,Array,Date,RegExp等,說(shuō)白了就是對(duì)象。...
摘要:例子中,屬于基本類(lèi)型對(duì)象?;緮?shù)據(jù)類(lèi)型和引用類(lèi)型作方法入?yún)r(shí)的差異通常,在函數(shù)調(diào)用時(shí),如果入?yún)榛緮?shù)據(jù)類(lèi)型時(shí),函數(shù)的參數(shù)將以值傳遞的方式傳遞。 前言:再次翻閱JS高程(第3版)過(guò)程中,看到了基本包裝類(lèi)型,趁熱留下此文,對(duì)JS的數(shù)據(jù)類(lèi)型做個(gè)較為深入的小結(jié)(2018-10-19)。 雖然JS與其他強(qiáng)類(lèi)型語(yǔ)言不一樣,聲明中無(wú)需預(yù)設(shè)數(shù)據(jù)類(lèi)型,但是JS也是有數(shù)據(jù)類(lèi)型區(qū)分的。 基本數(shù)據(jù)類(lèi)型(...
摘要:今天來(lái)討論一下中的基本包裝對(duì)象也叫基本包裝類(lèi)型,之前剛學(xué)到這里的時(shí)候,自己也是一頭霧水,不明白這個(gè)基本包裝對(duì)象到底是個(gè)什么鬼,后來(lái)找了很多資料,終于看清了它的真面目?;绢?lèi)型引用類(lèi)型等,說(shuō)白了就是對(duì)象。。。 今天來(lái)討論一下JS中的基本包裝對(duì)象(也叫基本包裝類(lèi)型),之前剛學(xué)到這里的時(shí)候,自己也是一頭霧水,不明白這個(gè)基本包裝對(duì)象到底是個(gè)什么鬼,后來(lái)找了很多資料,終于看清了它的真面目。首先呢...
摘要:來(lái)自你不知道的對(duì)未初始化和未聲明的變量執(zhí)行操作符都返回了值類(lèi)型是第二個(gè)只有一個(gè)值的數(shù)據(jù)類(lèi)型,這個(gè)特殊的值是。 基本類(lèi)型 主要有:undefined、null、布爾值(Boolean)、字符串(String)、數(shù)值(Number)、Symbol undefined 在使用 var,let,const 聲明變量但未對(duì)其加以初始化時(shí),這個(gè)變量的值就是undefined 注意點(diǎn): ...
摘要:平時(shí)在復(fù)習(xí)基礎(chǔ)知識(shí)時(shí),經(jīng)常會(huì)遇到數(shù)據(jù)類(lèi)型基礎(chǔ)數(shù)據(jù)類(lèi)型內(nèi)置對(duì)象包裝類(lèi)型對(duì)象,檢測(cè)數(shù)據(jù)類(lèi)型時(shí),用到的值,感覺(jué)都差不多,但是又有差異。值與數(shù)據(jù)類(lèi)型關(guān)系對(duì)比下圖,即可知值相較于基礎(chǔ)數(shù)據(jù)類(lèi)型少多 平時(shí)在復(fù)習(xí)JS基礎(chǔ)知識(shí)時(shí),經(jīng)常會(huì)遇到JS數(shù)據(jù)類(lèi)型、基礎(chǔ)數(shù)據(jù)類(lèi)型、內(nèi)置對(duì)象、包裝類(lèi)型對(duì)象,檢測(cè)數(shù)據(jù)類(lèi)型時(shí),用到的typeof值,感覺(jué)都差不多,但是又有差異。今天特地整理下,方便理解。 JS數(shù)據(jù)類(lèi)型 基礎(chǔ)數(shù)...
閱讀 1996·2021-09-09 09:33
閱讀 1118·2019-08-30 15:43
閱讀 2671·2019-08-30 13:45
閱讀 3313·2019-08-29 11:00
閱讀 863·2019-08-26 14:01
閱讀 3576·2019-08-26 13:24
閱讀 487·2019-08-26 11:56
閱讀 2696·2019-08-26 10:27