亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

理解JavaScript變量和類型

xiaodao / 2588人閱讀

摘要:接著下一個(gè)例子賦予副本新的地址可見,函數(shù)參數(shù)傳遞的并不是變量的引用,而是變量拷貝的副本,當(dāng)變量是原始類型時(shí),這個(gè)副本就是值本身,當(dāng)變量是引用類型是,這個(gè)副本是指向堆內(nèi)存的地址。

轉(zhuǎn)載自ConardLi: 《【JS進(jìn)階】 你真的掌握變量和類型了嗎》 公眾號(hào): code秘密花園

1. JavaScript數(shù)據(jù)類型

ECMAScript標(biāo)準(zhǔn)規(guī)定了7種數(shù)據(jù)類型,這些數(shù)據(jù)類型分為原始類型對(duì)象類型

1.1 原始類型局有不可變性:
如下:

var str = "abc";
str.slice(1);
str.substr(1);
str.trim(1);
str.toLowerCase(1);
str[0] = 1;
console.log(str); //abc

以上這些方法都在原字符串的基礎(chǔ)上產(chǎn)生一個(gè)新字符串,而非直接去改變str,這印證了字符串的不可變形。

當(dāng)執(zhí)行以下代碼時(shí):

str += "6";
console.log(str); //abc6

可見str的值被改變了,這貌似與字符串的不可變性不符合呀,這個(gè)要從內(nèi)存上來理解。

在JavaScript中,每一個(gè)變量在內(nèi)存中都需要一個(gè)空間來存儲(chǔ)。
內(nèi)存空間有分為棧內(nèi)存和堆內(nèi)存。

棧內(nèi)存:

存儲(chǔ)的值大小固定

空間較小

可以直接操作其保存的變量,運(yùn)行效率高

由系統(tǒng)自動(dòng)分配存儲(chǔ)空間

JavaScript中的原始類型的值被直接存儲(chǔ)在占中,在變量定義時(shí),棧就為其分配好了內(nèi)存空間。

由于棧中的內(nèi)存空間的大小是固定的,所以存儲(chǔ)在棧中的變量就是不可變的。
而當(dāng)執(zhí)行了 str += "6" 的操作時(shí),實(shí)際上是在棧中又開辟了一塊內(nèi)存空間用于存儲(chǔ)‘a(chǎn)bc6’,然后將變量str指向這塊空間。

1.2 引用類型

堆內(nèi)存:

存儲(chǔ)的值大小不定,可動(dòng)態(tài)調(diào)整

空間較大,運(yùn)行效率低

無法直接操作其內(nèi)部存儲(chǔ),使用引用地址讀取

通過代碼進(jìn)行分配空間

引用類型的值實(shí)際存儲(chǔ)在堆內(nèi)存中,它在棧中只存儲(chǔ)了一個(gè)固定長(zhǎng)度的地址,這個(gè)地址指向堆內(nèi)存中的值。

如下:

var obj1 = {name: "abc"};
var obj2 = {age: 18};
var obj3 = function() {...};
var obj4 = [1, 2, 3, 4, 5];

引用類型不具有不可變性,可以改變它們:

obj1.name = "abc6";
obj2.age = 19;
obj4.length = 0;
console.log(obj1); //{name: "abc6"}
console.log(obj2); //{age: 19}
console.log(obj4); //[]

以數(shù)組為例,它的很多方法都可以改變它自身:

pop()

push()

shift()

unshift()

reverse()

sort()

splice()

1.3 復(fù)制

原始類型的復(fù)制:

var name = "abc";
var name2 = name;
name2 = "code";
console.log(name); //abc

內(nèi)存中有一個(gè)變量name,值為abc。從變量name復(fù)制出一個(gè)變量name2,此時(shí)在內(nèi)存中創(chuàng)建了一個(gè)塊新的空間用于存儲(chǔ)abc,雖然兩者的值是相同的,但是兩者指向的內(nèi)存空間完全不同,這兩個(gè)變量參與任何操作都互不影響。

引用類型的復(fù)制:

var obj = {name: "abc"};
var obj2 = obj;
obj2.name = "code";
console.log(obj.name); //code

當(dāng)復(fù)制引用類型的變量時(shí),實(shí)際上復(fù)制的是堆中存儲(chǔ)的地址,所以復(fù)制出來的obj2實(shí)際上和obj指向的堆中同一個(gè)對(duì)象。因此,改變其中任何一個(gè)變量的值,兩一個(gè)變量都會(huì)受到影響。

1.4 比較
當(dāng)對(duì)兩個(gè)變量進(jìn)行比較時(shí),不同類型的變量的表現(xiàn)是不同的:

var name = "abc";
var name2 = "abc";
console.log(name === name2); //true
var obj = {name: "abc"};
var obj2 = {name: "abc"};
console.log(obj === obj2); //false

對(duì)于原始類型,比較時(shí)會(huì)直接比較它們的值,如果值相等,即返回true。
對(duì)于引用類型,比較時(shí)會(huì)比較它們的引用地址,雖然兩個(gè)變量在堆中存儲(chǔ)的對(duì)象具有屬性值都是相等的,但是它們被存儲(chǔ)在了不同的存儲(chǔ)空間,因此比較值為false。

1.5 值傳遞和引用傳遞
如下:

let name = "abc";
function changeValue(name) {
name = "code";
}
changeValue(name);
console.log(name);

執(zhí)行上面的代碼,如果最終打印出來的name是‘a(chǎn)bc’,沒有改變,說明函數(shù)參數(shù)傳遞的是變量的值,即值傳遞。如果最終打印出來的是‘code’,函數(shù)內(nèi)部的操作可以改變傳入的變量,那么說明函數(shù)參數(shù)傳遞的是引用,即引用傳遞。

上面的例子執(zhí)行結(jié)果是‘a(chǎn)bc’,即函數(shù)參數(shù)僅僅是被傳入變量復(fù)制給了的一個(gè)局部變量。改變這個(gè)局部變量不會(huì)對(duì)外部變量產(chǎn)生影響。

let obj = {name: "abc"};
function changeValue(obj) {
obj.name = "code";
}
changeValue(obj);
console.log(obj.name); //code

ECMAScript中的所有的函數(shù)的參數(shù)都是按值傳遞的。

當(dāng)函數(shù)參數(shù)是引用類型時(shí),同樣將參數(shù)復(fù)制了一個(gè)副本到局部變量,只不過復(fù)制的這個(gè)副本是指向堆內(nèi)存中的地址而已,在函數(shù)內(nèi)部對(duì)對(duì)象的屬性進(jìn)行操作,實(shí)際上和外部變量指向堆內(nèi)存中的值相同,但是這并不代表這引用傳遞。

接著下一個(gè)例子:

let obj = {};
function changeValue(obj) {
obj.name = "abc";
obj = {name: "code"}; //賦予副本新的地址
}
changeValue(obj);
console.log(obj.name); //abc

可見,函數(shù)參數(shù)傳遞的并不是變量的引用,而是變量拷貝的副本,當(dāng)變量是原始類型時(shí),這個(gè)副本就是值本身,當(dāng)變量是引用類型是,這個(gè)副本是指向堆內(nèi)存的地址。

重要的事情說三遍:

ECMAScript中的所有的函數(shù)的參數(shù)都是按值傳遞的。

ECMAScript中的所有的函數(shù)的參數(shù)都是按值傳遞的。

ECMAScript中的所有的函數(shù)的參數(shù)都是按值傳遞的。

轉(zhuǎn)載自ConardLi: 《【JS進(jìn)階】 你真的掌握變量和類型了嗎》 公眾號(hào): code秘密花園

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/104924.html

相關(guān)文章

  • 深入理解 JavaScript中的變量、值、傳參

    摘要:所以說在中,也并不是一切都是對(duì)象原始類型值不可變?cè)碱愋偷淖兞康闹凳遣豢勺兊?,只能給變量賦予新的值??梢岳斫饣绢愋偷淖兞康闹担褪亲置嫔蠈懙臄?shù)值。有四個(gè)變量圖調(diào)用是傳參,內(nèi)層的會(huì)屏蔽外層的。圖內(nèi)層的的值被改變成的值被改變?yōu)椤? showImg(https://segmentfault.com/img/bVbldfK); 1. demo 如果你對(duì)下面的代碼沒有任何疑問就能自信的回答出輸出...

    endiat 評(píng)論0 收藏0
  • 談?wù)?em>javascript語法里一些難點(diǎn)問題(一)

    摘要:引子前不久我建立的技術(shù)群里一位問了一個(gè)這樣的問題,她貼出的代碼如下所示執(zhí)行結(jié)果如下所示第一個(gè)第二個(gè)這是一個(gè)令人詫異的結(jié)果,為什么第一個(gè)彈出框顯示的是,而不是呢這種疑惑的原理我描述如下一個(gè)頁面里直接定義在標(biāo)簽下的變量是全局變量即屬于對(duì)象的變量 1) 引子 前不久我建立的技術(shù)群里一位MM問了一個(gè)這樣的問題,她貼出的代碼如下所示: var a = 1; function hehe...

    huaixiaoz 評(píng)論0 收藏0
  • 前端基礎(chǔ)進(jìn)階(一):內(nèi)存空間詳細(xì)圖解

    摘要:一棧數(shù)據(jù)結(jié)構(gòu)與不同,中并沒有嚴(yán)格意義上區(qū)分棧內(nèi)存與堆內(nèi)存。引用數(shù)據(jù)類型的值是保存在堆內(nèi)存中的對(duì)象。不允許直接訪問堆內(nèi)存中的位置,因此我們不能直接操作對(duì)象的堆內(nèi)存空間。為了更好的搞懂變量對(duì)象與堆內(nèi)存,我們可以結(jié)合以下例子與圖解進(jìn)行理解。 showImg(https://segmentfault.com/img/remote/1460000009784102?w=1240&h=683); ...

    _Suqin 評(píng)論0 收藏0
  • JavaScript 到 TypeScript - 聲明類型

    摘要:要為變量或者常量指定類型也很簡(jiǎn)單,就是在變量常量名后面加個(gè)冒號(hào),再指定類型即可,比如聲明函數(shù)是類型,即返回值是類型聲明參數(shù)是類型聲明是無返回值的聲明是這段代碼演示了對(duì)函數(shù)類型參數(shù)類型和變量類型地聲明。變量函數(shù)參數(shù)和返回值需要申明類型。 從 JavaScript 語法改寫為 TypeScript 語法,有兩個(gè)關(guān)鍵點(diǎn),一點(diǎn)是類成員變量(Field)需要聲明,另一點(diǎn)是要為各種東西(變量、參數(shù)...

    Flands 評(píng)論0 收藏0
  • JavaScript 闖關(guān)記

    摘要:對(duì)象數(shù)組初始化表達(dá)式,闖關(guān)記之上文檔對(duì)象模型是針對(duì)和文檔的一個(gè)。闖關(guān)記之?dāng)?shù)組數(shù)組是值的有序集合。數(shù)組是動(dòng)態(tài)的,根闖關(guān)記之語法的語法大量借鑒了及其他類語言如和的語法。 《JavaScript 闖關(guān)記》之 DOM(下) Element 類型 除了 Document 類型之外,Element 類型就要算是 Web 編程中最常用的類型了。Element 類型用于表現(xiàn) XML 或 HTML 元素...

    mj 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

xiaodao

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<