摘要:例子中,屬于基本類型對象。基本數據類型和引用類型作方法入參時的差異通常,在函數調用時,如果入參為基本數據類型時,函數的參數將以值傳遞的方式傳遞。
前言:再次翻閱JS高程(第3版)過程中,看到了“基本包裝類型”,趁熱留下此文,對JS的數據類型做個較為深入的小結(2018-10-19)。
雖然JS與其他強類型語言不一樣,聲明中無需預設數據類型,但是JS也是有數據類型區分的。
基本數據類型(存儲值):Undefined、Null、Boolean、Number、String引用類型(存儲地址指針):對象
基本包裝類型(臨時性質的引用類型):alert("hello world!".split(" ").length); //2
基本數據類型
基本數據類型通常通過字面量進行賦值,基本數據類型變量存儲的是具體的值:
var strA = "stringA"; var strB = strA; alert(strB); //stringA strB = "stringB"; alert(strB); //stringB
將strA的賦值給strB,實際上只是將strA的值("stringA")賦值給變量strB。賦值完成,strA和strB并無任何關聯關系,此時修改strB的值,strA不會有任何的影響。
引用類型
引用類型存儲的值為地址指針。解釋器會在內存堆中創建一個實際的對象,然后將該對象的地址賦值給變量。引用變量之間的賦值,實際上是指針賦值:
var jsonA = {"val":"stringA"}; var jsonB = jsonA; alert(jsonB.val); // stringA jsonB.val = "stringB"; alert(jsonA.val); // stringB
對象jsonA創建后,它保存的并不是具體的json對象,而是指向這個對象地址的指針。此時,將jsonA的值賦值給jsonB,只是將其保存的地址指針賦值給jsonB。賦值完成后,jsonA和jsonB同時指向內存中的同一個對象。當通過jsonB進行操作該對象,A也會跟著“改變”。
基本包裝類型
基本數據類型只是一個簡單的,存儲值的變量,它不是對象,它并沒有任何的方法。但是我們卻可以把它當成對象一樣使用:
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
原因在于,當我們調用“基本數據類型”變量的方法時,后臺為我們將變量包裝成對應類型的臨時對象,然后完成我們的調用方法并返回,然后銷毀這個臨時對象。例子中,strA屬于基本類型對象。我們用typeof檢測時返回了“string”。我們卻可以直接調用該變量的split和length方法。我們將次變量當作對象一樣,對屬性“color”進行賦值,此時并不會報錯。但是當我們去使用這個屬性時,卻提示了“ undefined”,這是是因為strA并沒有這個屬性。
【基本數據類型】和【引用類型】作方法入參時的差異
通常,在函數調用時,如果入參為【基本數據類型】時,函數的參數將以“值傳遞”的方式傳遞。此時修改函數內接收該值的局部變量,并不會對函數外的變量產生影響:
var strA = "out Function!"; changeStrVal(strA); alert(strA); //out Function! function changeStrVal(paraStr){ var strB = paraStr; strB = "in Function!"; }
但是,如果入參為獨享,即【引用類型】,則函數內的局部變量和函數外的變量均指向同一塊內存地址。測試修改函數局部變量的屬性,函數外變量屬性也會隨之而變:
var objA = {"val":"out Function!"}; changeObjVal(objA); alert(objA.val); //in Function! function changeObjVal(paraObj){ var objB = paraObj; objB.val = "in Function!"; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/98511.html
摘要:每當讀取這個基本類型時,后臺會創建一個對應的基本包裝類型的對象。類型判斷主要是用來判斷基本數據類型返回類型新增所以只能用來判斷基本數據類型。引用類型基本包裝類型都會返回。 最近重溫JS高程設計以及與朋友的討論。決定趁熱打鐵記錄JS的各種類型,并做下深入總結。 js的幾種類型 基本類型:Boolean、String、Number、Null、Undefined 引用類型: 2.1 O...
摘要:這也解答了我曾經的一個疑問同樣的道理,在調用屬性的瞬間,也是使用先來實例化一個對象,所以那一瞬間他們的構造函數以及原型對象是相同的,但也僅僅是那一瞬間。 經常在國內的各大網站博客上看到一句話,叫做JS中萬物皆對象,那是否真是如此? 那么,我們先來捋一捋JS中的數據類型,JS中的數據類型有下面幾種 Undefined Null Boolean Number String Symbol ...
摘要:前兩天看到大神的關于基本數據類型和引用類型的區別的文章覺得寫得非常不錯,就想著在其基礎上加上自己平時看到的一些知識點和理解,所以就有了以下的文章基本數據類型基本數據類型包括基本數據類型是按值訪問的,就是說我們可以操作保存在變量中的實際的值基 前兩天看到kraaas大神的關于基本數據類型和引用類型的區別的文章覺得寫得非常不錯,就想著在其基礎上加上自己平時看到的一些知識點和理解,所以就有了...
摘要:平時在復習基礎知識時,經常會遇到數據類型基礎數據類型內置對象包裝類型對象,檢測數據類型時,用到的值,感覺都差不多,但是又有差異。值與數據類型關系對比下圖,即可知值相較于基礎數據類型少多 平時在復習JS基礎知識時,經常會遇到JS數據類型、基礎數據類型、內置對象、包裝類型對象,檢測數據類型時,用到的typeof值,感覺都差不多,但是又有差異。今天特地整理下,方便理解。 JS數據類型 基礎數...
閱讀 1487·2019-08-30 15:44
閱讀 1952·2019-08-30 14:07
閱讀 2879·2019-08-30 13:56
閱讀 2347·2019-08-29 17:06
閱讀 1330·2019-08-29 14:13
閱讀 2088·2019-08-29 11:28
閱讀 3233·2019-08-26 13:56
閱讀 1953·2019-08-26 12:11