摘要:例子中,屬于基本類(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)型(存儲(chǔ)值):Undefined、Null、Boolean、Number、String引用類(lèi)型(存儲(chǔ)地址指針):對(duì)象
基本包裝類(lèi)型(臨時(shí)性質(zhì)的引用類(lèi)型):alert("hello world!".split(" ").length); //2
基本數(shù)據(jù)類(lèi)型
基本數(shù)據(jù)類(lèi)型通常通過(guò)字面量進(jìn)行賦值,基本數(shù)據(jù)類(lèi)型變量存儲(chǔ)的是具體的值:
var strA = "stringA"; var strB = strA; alert(strB); //stringA strB = "stringB"; alert(strB); //stringB
將strA的賦值給strB,實(shí)際上只是將strA的值("stringA")賦值給變量strB。賦值完成,strA和strB并無(wú)任何關(guān)聯(lián)關(guān)系,此時(shí)修改strB的值,strA不會(huì)有任何的影響。
引用類(lèi)型
引用類(lèi)型存儲(chǔ)的值為地址指針。解釋器會(huì)在內(nèi)存堆中創(chuàng)建一個(gè)實(shí)際的對(duì)象,然后將該對(duì)象的地址賦值給變量。引用變量之間的賦值,實(shí)際上是指針賦值:
var jsonA = {"val":"stringA"}; var jsonB = jsonA; alert(jsonB.val); // stringA jsonB.val = "stringB"; alert(jsonA.val); // stringB
對(duì)象jsonA創(chuàng)建后,它保存的并不是具體的json對(duì)象,而是指向這個(gè)對(duì)象地址的指針。此時(shí),將jsonA的值賦值給jsonB,只是將其保存的地址指針賦值給jsonB。賦值完成后,jsonA和jsonB同時(shí)指向內(nèi)存中的同一個(gè)對(duì)象。當(dāng)通過(guò)jsonB進(jìn)行操作該對(duì)象,A也會(huì)跟著“改變”。
基本包裝類(lèi)型
基本數(shù)據(jù)類(lèi)型只是一個(gè)簡(jiǎn)單的,存儲(chǔ)值的變量,它不是對(duì)象,它并沒(méi)有任何的方法。但是我們卻可以把它當(dāng)成對(duì)象一樣使用:
var strA = "Hello-World!"; alert(strA.split("-").length); //2 alert(typeof strA); //string strA.color = "yellow"; alert(strA.color); //undefined var strB = new String("Hello-World!"); alert(strB.split("-").length); //2 alert(typeof strB); //object strB.color = "red"; alert(strB.color); //red var strC = strB; strC.color = "blue"; alert(strB.color); //red
原因在于,當(dāng)我們調(diào)用“基本數(shù)據(jù)類(lèi)型”變量的方法時(shí),后臺(tái)為我們將變量包裝成對(duì)應(yīng)類(lèi)型的臨時(shí)對(duì)象,然后完成我們的調(diào)用方法并返回,然后銷(xiāo)毀這個(gè)臨時(shí)對(duì)象。例子中,strA屬于基本類(lèi)型對(duì)象。我們用typeof檢測(cè)時(shí)返回了“string”。我們卻可以直接調(diào)用該變量的split和length方法。我們將次變量當(dāng)作對(duì)象一樣,對(duì)屬性“color”進(jìn)行賦值,此時(shí)并不會(huì)報(bào)錯(cuò)。但是當(dāng)我們?nèi)ナ褂眠@個(gè)屬性時(shí),卻提示了“ undefined”,這是是因?yàn)閟trA并沒(méi)有這個(gè)屬性。
【基本數(shù)據(jù)類(lèi)型】和【引用類(lèi)型】作方法入?yún)r(shí)的差異
通常,在函數(shù)調(diào)用時(shí),如果入?yún)椤净緮?shù)據(jù)類(lèi)型】時(shí),函數(shù)的參數(shù)將以“值傳遞”的方式傳遞。此時(shí)修改函數(shù)內(nèi)接收該值的局部變量,并不會(huì)對(duì)函數(shù)外的變量產(chǎn)生影響:
var strA = "out Function!"; changeStrVal(strA); alert(strA); //out Function! function changeStrVal(paraStr){ var strB = paraStr; strB = "in Function!"; }
但是,如果入?yún)楠?dú)享,即【引用類(lèi)型】,則函數(shù)內(nèi)的局部變量和函數(shù)外的變量均指向同一塊內(nèi)存地址。測(cè)試修改函數(shù)局部變量的屬性,函數(shù)外變量屬性也會(huì)隨之而變:
var objA = {"val":"out Function!"}; changeObjVal(objA); alert(objA.val); //in Function! function changeObjVal(paraObj){ var objB = paraObj; objB.val = "in Function!"; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/98511.html
摘要:每當(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 O...
摘要:來(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): ...
摘要:這也解答了我曾經(jīng)的一個(gè)疑問(wèn)同樣的道理,在調(diào)用屬性的瞬間,也是使用先來(lái)實(shí)例化一個(gè)對(duì)象,所以那一瞬間他們的構(gòu)造函數(shù)以及原型對(duì)象是相同的,但也僅僅是那一瞬間。 經(jīng)常在國(guó)內(nèi)的各大網(wǎng)站博客上看到一句話(huà),叫做JS中萬(wàn)物皆對(duì)象,那是否真是如此? 那么,我們先來(lái)捋一捋JS中的數(shù)據(jù)類(lèi)型,JS中的數(shù)據(jù)類(lèi)型有下面幾種 Undefined Null Boolean Number String Symbol ...
摘要:前兩天看到大神的關(guān)于基本數(shù)據(jù)類(lèi)型和引用類(lèi)型的區(qū)別的文章覺(jué)得寫(xiě)得非常不錯(cuò),就想著在其基礎(chǔ)上加上自己平時(shí)看到的一些知識(shí)點(diǎn)和理解,所以就有了以下的文章基本數(shù)據(jù)類(lèi)型基本數(shù)據(jù)類(lèi)型包括基本數(shù)據(jù)類(lèi)型是按值訪(fǎng)問(wèn)的,就是說(shuō)我們可以操作保存在變量中的實(shí)際的值基 前兩天看到kraaas大神的關(guān)于基本數(shù)據(jù)類(lèi)型和引用類(lèi)型的區(qū)別的文章覺(jué)得寫(xiě)得非常不錯(cuò),就想著在其基礎(chǔ)上加上自己平時(shí)看到的一些知識(shí)點(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ù)...
閱讀 1482·2019-08-30 15:44
閱讀 1946·2019-08-30 14:07
閱讀 2871·2019-08-30 13:56
閱讀 2337·2019-08-29 17:06
閱讀 1324·2019-08-29 14:13
閱讀 2079·2019-08-29 11:28
閱讀 3224·2019-08-26 13:56
閱讀 1941·2019-08-26 12:11