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

資訊專(zhuān)欄INFORMATION COLUMN

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

endiat / 1784人閱讀

摘要:所以說(shuō)在中,也并不是一切都是對(duì)象原始類(lèi)型值不可變?cè)碱?lèi)型的變量的值是不可變的,只能給變量賦予新的值??梢岳斫饣绢?lèi)型的變量的值,就是字面上寫(xiě)的數(shù)值。有四個(gè)變量圖調(diào)用是傳參,內(nèi)層的會(huì)屏蔽外層的。圖內(nèi)層的的值被改變成的值被改變?yōu)椤?/p>

1. demo

如果你對(duì)下面的代碼沒(méi)有任何疑問(wèn)就能自信的回答出輸出的內(nèi)容,那么本篇文章就不值得你浪費(fèi)時(shí)間了。

var var1 = 1
var var2 = true
var var3 = [1,2,3]
var var4 = var3

function test (var1, var3) {
    var1 = "changed"
    var3[0] = "changed"
    var3 = "changed"
}

test(var1, var3)

console.log(var1, var2, var3, var4)
2. 深入理解原始類(lèi)型

原始類(lèi)型有5個(gè) Undefinded, Null, Boolean, Number, String

2.1. 原始類(lèi)型變量沒(méi)有屬性和方法
// 抬杠, 下面的length屬性,toString方法怎么有屬性和方法呢?
var a = "oooo"
a.length
a.toString

原始類(lèi)型中,有三個(gè)特殊的引用類(lèi)型Boolean, Number, String,在操作原始類(lèi)型時(shí),原始類(lèi)型變量會(huì)轉(zhuǎn)換成對(duì)應(yīng)的基本包裝類(lèi)型變量去操作。參考JavaScript高級(jí)程序設(shè)計(jì) 5.6 基本包裝類(lèi)型。

所以說(shuō):在js中,也并不是一切都是對(duì)象

2.2. 原始類(lèi)型值不可變

原始類(lèi)型的變量的值是不可變的,只能給變量賦予新的值。

下面給出例子

// str1 開(kāi)始的值是aaa
var str1 = "aaa"
// 首先創(chuàng)建一個(gè)能容納6個(gè)字符串的新字符串
// 然后再這個(gè)字符串中填充 aaa和bbb
// 最后銷(xiāo)毀字符串 aaa和bbb
// 而不能理解成在str1的值aaa后追加bbb
str1 = str1 + "bbb"

其他原始類(lèi)型的值也是不可變的, 例如數(shù)值類(lèi)型的。

2.3. 原始類(lèi)型值是字面量 3. 變量和值有什么區(qū)別?

不是每一個(gè)值都有地址,但每一個(gè)變量有。《Go程序設(shè)計(jì)語(yǔ)言》

變量沒(méi)有類(lèi)型,值有。變量可以用來(lái)保存任何類(lèi)型的值。《You-Dont-Know-JS》

變量都是有內(nèi)存地址的,變量有用來(lái)保存各種類(lèi)型的值;不同類(lèi)型的值,占用的空間不同。

var a = 1
typeof a // 檢測(cè)的不是變量a的類(lèi)型,而是a的值1的類(lèi)型
4. 變量訪問(wèn)有哪些方式?

變量訪問(wèn)的方式有兩種:

按值訪問(wèn)

按引用訪問(wèn)

在JS中,五種基本類(lèi)型Undefinded, Null, Boolean, Number, String是按照值訪問(wèn)的?;绢?lèi)型變量的值就是字面上表示的值。而引用類(lèi)型的值是指向該對(duì)象的指針,而指針可以理解為內(nèi)存地址。

可以理解基本類(lèi)型的變量的值,就是字面上寫(xiě)的數(shù)值。而引用類(lèi)型的值則是一個(gè)內(nèi)存地址。但是這個(gè)內(nèi)存地址,對(duì)于程序來(lái)說(shuō),是透明不可見(jiàn)的。無(wú)論是Get還是Set都無(wú)法操作這個(gè)內(nèi)存地址。

下面是個(gè)示意表格。

語(yǔ)句 變量 Get 訪問(wèn)類(lèi)型
var a = 1 a 1 1 按值
var a = [] a 0x00000320 [] 按引用
抬杠 Undefinded, Null, Boolean, Number是基本類(lèi)型可以理解,因?yàn)檫@些類(lèi)型的變量所占用的內(nèi)存空間都是大小固定的。但是string類(lèi)型的變量,字符串的長(zhǎng)短都是不一樣的,也就是說(shuō),字符串占用的內(nèi)存空間大小是不固定的,為什么string被列為按值訪問(wèn)呢?

基本類(lèi)型和引用類(lèi)型的本質(zhì)區(qū)別是,當(dāng)這個(gè)變量被分配值時(shí),它需要向操作系統(tǒng)申請(qǐng)內(nèi)存資源,如果你向操作系統(tǒng)申請(qǐng)的內(nèi)存空間的大小是固定的,那么就是基本類(lèi)型,反之,則為引用類(lèi)型。

5. 例子的解釋
var var1 = 1
var var2 = true
var var3 = [1,2,3]
var var4 = var3

function test (var1, var3) {
    var1 = "changed" // a
    var3[0] = "changed" // b
    var3 = "changed" // c
}

test(var1, var3)

console.log(var1, var2, var3, var4)

上面的js分為兩個(gè)調(diào)用棧,在

圖1 外層的調(diào)用棧。有四個(gè)變量v1、v2、v3、v4

圖2 調(diào)用test是傳參,內(nèi)層的v1、v3會(huì)屏蔽外層的v1、v3。內(nèi)層的v1,v3和外層的v1、v3內(nèi)存地址是不同的。內(nèi)層v1和外層v1已經(jīng)沒(méi)有任何關(guān)系了,但是內(nèi)層的v3和外層v3仍然指向同一個(gè)數(shù)組。

圖3 內(nèi)層的v1的值被改變成"changed‘, v3[0]的值被改變?yōu)?changed"。

圖4 內(nèi)層v3的值被重寫(xiě)為字符串changed, 徹底斷了與外層v3聯(lián)系。

圖5 當(dāng)test執(zhí)行完畢,內(nèi)層的v1和v3將不會(huì)存在,ox75和ox76位置的內(nèi)存空間也會(huì)被釋放

最終的輸出:

1 true ["changed", 2, 3] ["changed", 2, 3]
6. 如何深入學(xué)習(xí)JS、Node.js

看完兩個(gè)stackoverflow上兩個(gè)按照投票數(shù)量的榜單

JavaScript問(wèn)題榜單

Node.js問(wèn)題榜單

如果學(xué)習(xí)有捷徑的話,踩一遍別人踩過(guò)的坑,可能就是捷徑。

7. 參考

is-javascript-a-pass-by-reference-or-pass-by-value-language

Is number in JavaScript immutable? duplicate

Immutability in JavaScript

the-secret-life-of-javascript-primitives

JavaScript data types and data structuresLanguages Edit Advanced

Understanding Javascript immutable variable

Explaining Value vs. Reference in Javascript

You-Dont-Know-JS

《JavaScript高級(jí)程序設(shè)計(jì)(第3版)》[美] 尼古拉斯·澤卡斯

掃碼訂閱我的微信公眾號(hào):洞香春天。每天一篇技術(shù)短文,讓知識(shí)不再高冷。

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

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

相關(guān)文章

  • 關(guān)于JavaScript 函數(shù)傳參

    摘要:最早由在年的語(yǔ)言中提出。該求值策略被用于等多種語(yǔ)言。該策略的重點(diǎn)是調(diào)用函數(shù)傳參時(shí),函數(shù)接受對(duì)象實(shí)參引用的副本既不是按值傳遞的對(duì)象副本,也不是按引用傳遞的隱式引用。它和按引用傳遞的不同在于在共享傳遞中對(duì)函數(shù)形參的賦值,不會(huì)影響實(shí)參的值。 周五晚上下班回家的路上,突然想到了 CommonJS 規(guī)范、Node.js 模塊化等等各種東西,然后就想到了熟悉的 module.exports。 大約...

    CloudwiseAPM 評(píng)論0 收藏0
  • 圖解JavaScript的參數(shù)傳遞

    摘要:寫(xiě)在最前本次嘗試通過(guò)流程圖的形式并結(jié)合兩個(gè)例子來(lái)重新理解一下中的參數(shù)傳遞。歡迎關(guān)注我的博客,不定期更新中參數(shù)到底如何傳遞借用紅寶書(shū)的一句話中所有函數(shù)的參數(shù)都是按值傳遞的這個(gè)值如果是簡(jiǎn)單類(lèi)型,那么就是其本身。同時(shí)執(zhí)行第一個(gè)結(jié)果即為。 寫(xiě)在最前 本次嘗試通過(guò)流程圖的形式并結(jié)合兩個(gè)例子來(lái)重新理解一下JavaScript中的參數(shù)傳遞。 歡迎關(guān)注我的博客,不定期更新中—— 參數(shù)到底如何傳遞? 借...

    Berwin 評(píng)論0 收藏0
  • call by sharing——JavaScript中“共享傳參”和“按傳參”的理解

    摘要:眾所周知,中參數(shù)是按值傳遞的。先大概介紹按值傳參基本類(lèi)型基本類(lèi)型的參數(shù)傳遞比較簡(jiǎn)單,示例代碼的值復(fù)制給了函數(shù)內(nèi)部的局部變量所以在函數(shù)內(nèi)部改變的值并不會(huì)影響外部的值。 眾所周知,JavaScript中參數(shù)是按值傳遞的。與訪問(wèn)變量不同,基本類(lèi)型和引用類(lèi)型的參數(shù)在傳遞時(shí)都如同變量的復(fù)制。 但是我們?cè)谑褂靡妙?lèi)型的參數(shù)傳遞時(shí),經(jīng)常會(huì)發(fā)現(xiàn)在函數(shù)內(nèi)改變引用類(lèi)型參數(shù)(如對(duì)象)會(huì)在函數(shù)外反映出來(lái),這種...

    jsdt 評(píng)論0 收藏0
  • 深入理解ES6》筆記——函數(shù)(3)

    摘要:錯(cuò)誤的寫(xiě)法錯(cuò)誤的寫(xiě)法中的構(gòu)造函數(shù)新增了支持默認(rèn)參數(shù)和不定參數(shù)。箭頭函數(shù)的簡(jiǎn)單理解箭頭函數(shù)的左邊表示輸入的參數(shù),右邊表示輸出的結(jié)果。但是有了尾調(diào)用優(yōu)化之后,遞歸函數(shù)的性能有了提升。 作為前端切圖仔,越發(fā)覺(jué)得自己離不開(kāi)函數(shù)了。 說(shuō)到JavaScript函數(shù),腦子里都是匿名函數(shù)、普通函數(shù)、閉包函數(shù)、構(gòu)造函數(shù)......然后還能說(shuō)出一大堆函數(shù)的概念。如果你達(dá)到這個(gè)水平,那么函數(shù)對(duì)你來(lái)說(shuō)沒(méi)有難度...

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

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

0條評(píng)論

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