摘要:原始數(shù)據(jù)類型和原始數(shù)據(jù)類型實在太簡單,所以只簡單劃幾個重點原始數(shù)據(jù)類型不可改變原始數(shù)據(jù)類型一個非常重要的特征就是不可改變。引用數(shù)據(jù)類型這里的不是狹義的,包含的預(yù)定義引用類型,對,這些都是引用數(shù)據(jù)類型。
JavaScript是腳本語言
計算機語言可以分為三類,機器語言、匯編語言、高級語言。高級語言又可以簡單分為解釋類和編譯類。這個知道就夠了。
機器語言: 計算機所能識別的二進(jìn)制語言,一般也不會直接拿來用于編程,無法理解且難以記憶 匯編語言: 底層程序可以直接理解的指令,一般是英文縮寫,一般簡短、簡單(功能簡單),只能做一些非常細(xì)微的操作,復(fù)雜的操作往往伴隨著大量的指令,我等一般接觸不多 高級語言: 簡單理解,我們平常接觸到的聽說過的基本都是高級語言。高級語言又分為解釋類和編譯類。解釋類語言和編譯類語言都需要轉(zhuǎn)換成機器語言才能被機器執(zhí)行,區(qū)別在于轉(zhuǎn)換的時間,解釋類語言也就是一般通稱的腳本語言,依賴于解釋器,邊解釋邊執(zhí)行,編譯類是全部轉(zhuǎn)換(編譯)好了,打包拿出去執(zhí)行。JavaScript不需要編譯,但是需要在自己的解釋器上執(zhí)行,比如我們常用的瀏覽器。內(nèi)存、地址、指針
有過C語言基礎(chǔ)的人一定聽說過這么一句話,指針是C語言的靈魂。但是似乎在JavaScript中,并沒有接觸過所謂的指針的概念,但JavaScript的解釋器(JavaScript引擎)不管用什么編寫,有的是C,有的是C++,也或者是Java,甚至是JavaScript自舉實現(xiàn)的JavaScript解釋器(元循環(huán)虛擬機),都逃不脫內(nèi)存和指針,在JaVaScript中也有體現(xiàn)。所以了解下這些概念,對于學(xué)習(xí)JavaScript,總歸是有好處的。
計算機內(nèi)存最小單位是位,8位一個字節(jié)(byte),實際計算機中,內(nèi)存最小單位是字節(jié)(byte),通俗來講,可以把內(nèi)存條當(dāng)做內(nèi)存,計算機運行時臨時存儲數(shù)據(jù)的地方。也可以把它看做一個大的圖書館,有無數(shù)個格子,每個格子都有一個編號,這個編號就是地址,每個地址對應(yīng)唯一一段內(nèi)存。我們通常所說的系統(tǒng)為數(shù)據(jù)分配一段內(nèi)存,也就是給這個數(shù)據(jù)分配格子,一個格子放不下,那就給分三五個格子來放。而指針則是固定占用4個格子(4byte),里面放的不是真實的數(shù)據(jù),而是放的另外一段內(nèi)存的地址,只是個地址。
原始數(shù)據(jù)類型Undefined、Null、Boolean、Number、String和Symbol(ES6)
原始數(shù)據(jù)類型實在太簡單,所以只簡單劃幾個重點:
原始數(shù)據(jù)類型不可改變 原始數(shù)據(jù)類型一個非常重要的特征就是不可改變。原始數(shù)據(jù)類型是保存在棧中的,一旦聲明一個變量 var a = "老李";解釋器會申請一塊內(nèi)存來存儲"老李",a是標(biāo)識符(標(biāo)識符存儲的是內(nèi)存地址,但在經(jīng)過解釋/編譯后會就不需要了),如果此時其他操作嘗試修改a,比如a += ",你好!";,此時打印a,雖然會輸出"老李,你好!";但是實際這其中改變的是a的地址指向,解釋器會為"老李,你好!"申請一片新的內(nèi)存來存儲,a中存儲的指向改變了,原先的"老李"所占用的內(nèi)存會被回收但本身并未被改變。
原始數(shù)據(jù)類型是按值傳遞 原始數(shù)據(jù)類型的賦值,也是新開辟一片內(nèi)存地址來存放新的指針和值,比如:var b = a;雖然看起來b和a一樣,但實際上b和a一點點關(guān)系都沒有,各自有各自的標(biāo)識符和占用的內(nèi)存,只是剛好值相同。
引用數(shù)據(jù)類型Object
這里的Object不是狹義的Object,包含JavaScript的預(yù)定義引用類型:Object、Array、Date、Boolean、Number、String,對,這些都是引用數(shù)據(jù)類型。也就是一個數(shù)字/日期/布爾值/字符串他們的字面量聲明方式和構(gòu)造函數(shù)聲明方式會造成完全不一樣的結(jié)果。也就是上面劃的兩個重點,這里需要重新劃一下。
引用數(shù)據(jù)類型可以改變 我想說的不是這句廢話,引用數(shù)據(jù)類型和原始數(shù)據(jù)類型存儲在 棧和堆中,棧中存儲的是標(biāo)識符和指針,堆中存儲的才是實際地址。畫個表(表也懶得畫了,下面的湊活看)吧:
var a = 1; var a1 = a; var b = {value: 1}; var b1 = b; var c = new Object(1); var c1 = c; var d = new Number(1); var d1 = d; 棧 堆 a 1 無 a1 1(和a的1占用的不同的內(nèi)存) 無 b 指針,{value: 1}所占的內(nèi)存地址 {value: 1} b1 指針,指向和b相同,但指針本身存儲在新的內(nèi)存中 同上,且是同一塊內(nèi)存中的相同的值 c 指針,1所占的內(nèi)存地址 1(object) c1 指針,1所占的內(nèi)存地址,但指針本身存儲在新的內(nèi)存中 同上,且是同一塊內(nèi)存中的相同的值 d 指針,1所占的內(nèi)存地址 1(number) d1 指針,1所占的內(nèi)存地址,但指針本身存儲在新的內(nèi)存中 同上,且是同一塊內(nèi)存中的相同的值
簡單講,原始數(shù)據(jù)類型,永遠(yuǎn)是一個標(biāo)識符對應(yīng)一個值(一段內(nèi)存)且都存放在棧里;引用數(shù)據(jù)類型永遠(yuǎn)是一個標(biāo)識符對應(yīng)一個指針指向同一個值(同一段內(nèi)存),前二者存儲在棧中,最后一個在堆中。來幾個例子幫助理解下:
var a = 1; var a1 = a; a1 = 2; console.log(a, a1); //1 2
這個很好理解大家各自有各自的標(biāo)識符和內(nèi)存地址,你變你的,不影響我。下一個例子:
var b = {value: 1}; var b1 = b; b1.value = 2; console.log(b.value, b1.value) //2 2
也好理解,b和b1指向的是同一個東西,簡單理解就是b和b1共用同一個東西。b1改完了b再來訪問,拿到的肯定是改后的。下一個例子:
var c = new Object(1); var c1 = c; c1 = 2; console.log(c, c1) //{[[PrimitiveValue]]: 1} 2 PrimitiveValue就是指的原始值,這里其實只是將原始值1包裝成Object,而這個原始值1依然不可更改
也很簡單,c1 = 2;這句話重新聲明了c1,代表著指針的c1被回收了,c1被重新聲明為一個原始數(shù)據(jù)類型,這時候二者沒關(guān)系了,如果是換一個方法,比如:
var c = new Object(1); var c1 = c; c1.value = 1; console.log(c, c1) //{value: 1,[[PrimitiveValue]]: 1} {value: 1,[[PrimitiveValue]]: 1}
這樣就沒問題了。
參數(shù)中的原始數(shù)據(jù)和引用數(shù)據(jù)原始數(shù)據(jù)類型是按值傳遞的,引用數(shù)據(jù)類型是按引用傳遞的,看例子:
var a = 1; var b = {value: 1}; function foo(v){ v = "new Value"; } foo(a);
在函數(shù)調(diào)用時,其實進(jìn)行了如下操作:
將a賦值給v,也就是v = a;,創(chuàng)建了a的副本,此時v得到了自己的內(nèi)存,其中存放著1這個值,然后拿"new Value"去覆蓋1,然而這一切發(fā)生在a的副本上,和a完全沒有關(guān)系,所以此時打印出a,還是1。接著:
foo(b);
這個結(jié)果也很好猜,b也沒有變,同樣創(chuàng)建一個副本,副本有標(biāo)識符、指針,指針指向的也是b的指針指向的值,但是v = ”new Value“;執(zhí)行時,這個副本就被重新賦值位一個string了,原先那個指針被回收。接著:
var a = 1; var b = {value: 1}; var c = new Number(1); function foo(v){ v.value = "new Value"; } foo(a); foo(b); foo(c);
a依然是1,且不說原始數(shù)據(jù)不能被添加屬性,即便被添加也只是a的副本的事,和a沒一點關(guān)系;
b在函數(shù)執(zhí)行中同樣創(chuàng)建了副本,副本同樣有指針,指向了{value: 1}所在的實際地址,此時通過指針改變了存儲`{value:
1}`的內(nèi)存中的value值,所以此時再通過b去訪問,一樣是輸出改變后的值;
c和b原理一樣,只不過c本來沒有value屬性,所以會被添加一個value屬性,所以上面的abc結(jié)果分別是:
console.log(a); // 1 console.log(b); // {value: "new Value"} console.log(c); // Number {value: "new Value", [[PrimitiveValue]]: 1}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/87334.html
摘要:以和為例,說明中的數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)。對象用來表示通用的固定長度的原始二進(jìn)制數(shù)據(jù)緩沖區(qū)。中的數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)對和有了一個大概的了解,下面讓我們來看下它是如何進(jìn)行二進(jìn)制數(shù)據(jù)操作的。 概述 本文主要通過對JavaScript中數(shù)字?jǐn)?shù)據(jù)與二進(jìn)制數(shù)據(jù)之間的轉(zhuǎn)換,讓讀者能夠了解在JavaScript中如何對數(shù)字類型(包括但不限于Number類型)進(jìn)行處理。 二進(jìn)制數(shù)據(jù)在日常...
摘要:類型轉(zhuǎn)換和表示一個空對象。如果有其他類型想轉(zhuǎn)換為或者類型,直接賦值就可以了。都能隱式的把數(shù)據(jù)類型轉(zhuǎn)為類型。。。時間時間二數(shù)字類型轉(zhuǎn)換為字符串默認(rèn)是進(jìn)制是一個對象類型,所以其他類型轉(zhuǎn)化為通常都是。 前言 javaScript是一門可以自由進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換的編程語言,類型轉(zhuǎn)換是javaScript很重要的特色(坑點很多!!!),大家想以后寫出更多嚴(yán)謹(jǐn)?shù)拇a(少出一些莫名其妙的Bug),還是...
摘要:總結(jié)通過使用和,我們能夠在數(shù)據(jù)和二進(jìn)制數(shù)據(jù)中進(jìn)行互相轉(zhuǎn)換。下一篇系列相關(guān)的博客,將會介紹如何通過來向后端傳遞二進(jìn)制數(shù)據(jù),以及如何處理通過收到的二進(jìn)制數(shù)據(jù)。 概述 上一篇博客我們說到了如何進(jìn)行數(shù)字類型(如Short、Int、Long類型)如何在JavaScript中進(jìn)行二進(jìn)制轉(zhuǎn)換,如果感興趣的可以可以閱讀本系列第二篇博客——WebSocket系列之JavaScript中數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為...
摘要:的垃圾回收器,進(jìn)行回收。它們的數(shù)據(jù)就存放在堆內(nèi)存中,大小不一定,動態(tài)分配內(nèi)存,可隨時修改。引用類型的變量存的是其在堆內(nèi)存中的地址,值的讀取,就是讀取這個內(nèi)存地址中儲存的內(nèi)容。 這東西還是很重要的,你要是搞懂了,就會去除很多困惑,比如不知道大家在學(xué)習(xí)js 的時候,有沒有對 基礎(chǔ)類型 和 引用類型 感到困惑過,兩者之間 表現(xiàn)的不同之處。 js 不同其他編程語言,它是腳本語言。所以,它的數(shù)...
摘要:所以無論還是都會進(jìn)行類型轉(zhuǎn)換,唯一的區(qū)別,就是會置否而不會。這時候,肯定會有人問,假如說我有其他的數(shù)據(jù)類型呢,又不是數(shù)字又不是字符串,比如說數(shù)組啊,對象啊,布爾值啥的,那么如果是引用數(shù)據(jù)類型,則先轉(zhuǎn)為基本數(shù)據(jù)類型,再進(jìn)行比較。 上一章主要講了轉(zhuǎn)換到數(shù)字,字符串和布爾類型的一些知識點,那么這一講接著上面的繼續(xù)講。 思考下面這個問題: console.log(+123); // 123 ...
閱讀 2027·2021-11-08 13:14
閱讀 2935·2021-10-18 13:34
閱讀 2022·2021-09-23 11:21
閱讀 3582·2019-08-30 15:54
閱讀 1752·2019-08-30 15:54
閱讀 2919·2019-08-29 15:33
閱讀 2569·2019-08-29 14:01
閱讀 1941·2019-08-29 13:52