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

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript基礎(chǔ)系列---變量及其值類(lèi)型

sugarmo / 370人閱讀

摘要:但對(duì)于引用類(lèi)型的數(shù)據(jù)主要是對(duì)象和數(shù)組,變量指向的內(nèi)存地址,保存的只是一個(gè)引用地址指針,只能保證這個(gè)引用地址指針是固定的,至于它指向的堆內(nèi)存中的存儲(chǔ)的值是不是可變的,就完全不能控制了。

基礎(chǔ)概念

變量是存儲(chǔ)信息的容器,這里需要區(qū)分一下:變量不是指存儲(chǔ)的信息本身,而是指這個(gè)用于存儲(chǔ)信息的容器,可以把變量想象成一個(gè)個(gè)用來(lái)裝東西的紙箱子

變量需要聲明,并且建議在聲明的同時(shí)進(jìn)行初始化,如下所示:

var aa = "1";
let bb = 2;
const CC = 3;

如果重新聲明變量,該變量的值不會(huì)丟失

var aa = "cc";
var aa; //此時(shí)的值還是cc

變量名(標(biāo)志符)命名要求:

適用于變量/屬性/函數(shù)/函數(shù)參數(shù)的名字等

可由字母、數(shù)字、下劃線_及美元符$組成

不可以使用關(guān)鍵字、保留字以及true、false、null、(evalarguments嚴(yán)格模式下)

使用undefined雖然不會(huì)報(bào)錯(cuò),但是并不能聲明成功,無(wú)論給它初始化為什么,它的值仍然為undefined

最好使用字母開(kāi)頭(還可以使用_$

值類(lèi)型

變量可能包含兩種不同數(shù)據(jù)類(lèi)型的值:基本類(lèi)型值(簡(jiǎn)單的數(shù)據(jù)段)和引用類(lèi)型值(可能由多個(gè)值構(gòu)成的對(duì)象)

因?yàn)樗幸妙?lèi)型的值都是Object的實(shí)例,所以可以使用 xx instanceof Object 來(lái)判斷是否為引用類(lèi)型的值,如果是則會(huì)返回true,否則返回false

存儲(chǔ)方式

基本類(lèi)型值在內(nèi)存中占據(jù)固定大小空間,因此被保存在棧內(nèi)存中(棧由操作系統(tǒng)自動(dòng)分配釋放);

引用類(lèi)型值是對(duì)象,保存在堆內(nèi)存中;(堆:一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由OS回收)

訪問(wèn)方式

對(duì)于基本類(lèi)型,變量存儲(chǔ)的是具體的值,可以按值訪問(wèn),直接操作存儲(chǔ)的值

對(duì)于引用類(lèi)型,變量存儲(chǔ)的是對(duì)象引用地址(指針),是按引用訪問(wèn),當(dāng)查詢(xún)時(shí),我們需要先從棧中讀取存儲(chǔ)的內(nèi)存地址,然后再順藤摸瓜地找到保存在堆內(nèi)存中的值

復(fù)制變量值

復(fù)制時(shí),基本類(lèi)型拷貝的是具體的值,而引用類(lèi)型拷貝的是引用地址,所以引用類(lèi)型賦值時(shí)要格外注意?。?!

//基本類(lèi)型賦值
var num1 = 10;
var num2 = num1;
console.log(num1,num2);// 10, 10
num2 = 100;
console.log(num1,num2);// 10, 100

//引用類(lèi)型賦值
//person2拷貝了person1的引用地址,所以person1和person2實(shí)際上指向的是同一個(gè)對(duì)象
//所以改變person2會(huì)影響到person1
var person1 = {
    name:"cc"
};
var person2 = person1;
console.log(person1.name, person2.name);// cc, cc
person2.name = "cshine";
console.log(person1.name, person2.name);// cshine, cshine

var arr1 = [1,2,3];
var arr2 = arr1;
console.log(arr1, arr2);// [1, 2, 3], [1, 2, 3]
arr2[1]= "string";
console.log(arr1, arr2);// [1, "string", 3], [1, "string", 3]

傳遞參數(shù)

ECMAScript中所有的函數(shù)的參數(shù)都是按值傳遞,即使是引用類(lèi)型值的傳遞也是按值傳遞

傳遞基本類(lèi)型值時(shí),被傳遞的值會(huì)被復(fù)制給一個(gè)局部變量(即命名參數(shù)或者arguments中的一個(gè)元素)

傳遞引用類(lèi)型值時(shí),引用類(lèi)型值是一個(gè)引用地址(指針),它也會(huì)復(fù)制給一個(gè)局部變量,這個(gè)局部變量再根據(jù)這個(gè)地址去按引用訪問(wèn)對(duì)象,因此這個(gè)局部變量的變化會(huì)反映在函數(shù)的外部。所以還是按值傳遞,而不是因?yàn)樗前匆脗鬟f才導(dǎo)致局部變量的變化會(huì)反映在函數(shù)的外部

注意點(diǎn)

es6新增了letconst命令用來(lái)聲明變量

let命令,它的用法類(lèi)似于var,但是所聲明的變量,只在let命令所在的塊級(jí)作用域內(nèi)有效,且在該塊級(jí)作用域內(nèi)不可重復(fù)聲明

const聲明一個(gè)只讀的常量,一旦聲明,常量的值就不能改變,與let一樣,只在聲明所在的塊級(jí)作用域內(nèi)有效,且在該塊級(jí)作用域內(nèi)不可重復(fù)聲明

const實(shí)際上保證的,并不是變量的值不得改動(dòng),而是變量指向的那個(gè)內(nèi)存地址不得改動(dòng)。對(duì)于簡(jiǎn)單類(lèi)型的數(shù)據(jù)(數(shù)值、字符串、布爾值),值就保存在變量指向的那個(gè)內(nèi)存地址,因此等同于常量。但對(duì)于引用類(lèi)型的數(shù)據(jù)(主要是對(duì)象和數(shù)組),變量指向的內(nèi)存地址,保存的只是一個(gè)引用地址(指針),const只能保證這個(gè)引用地址(指針)是固定的,至于它指向的堆內(nèi)存中的存儲(chǔ)的值是不是可變的,就完全不能控制了。因此,將一個(gè)對(duì)象聲明為常量必須非常小心。

未使用var/let/const進(jìn)行聲明,此時(shí)創(chuàng)建的變量為全局變量,盡量不要這樣做!

var命令和function命令聲明的全局變量,是頂層對(duì)象的屬性,let命令、const命令、class命令聲明的全局變量,不屬于頂層對(duì)象的屬性(瀏覽器中為window,node中為global

對(duì)于var/let來(lái)說(shuō),只聲明而未初始化,此時(shí)變量存儲(chǔ)的信息是“空”的,也就是undefined;但是對(duì)于const來(lái)說(shuō),只聲明而不進(jìn)行初始化是不允許的,會(huì)拋出Missing initializer in const declaration的錯(cuò)誤,因?yàn)?b>const定義的是常量,一旦定義便不可更改。

聲明提升(hoisting

var命令聲明的變量會(huì)發(fā)生”聲明提升“現(xiàn)象,即變量可以在聲明之前使用,值為undefined

console.log(aa);// undefined
var aa = "string";
console.log(aa);// string

function聲明的函數(shù)也會(huì)發(fā)生”聲明提升“現(xiàn)象,函數(shù)在聲明之前可以使用,值為指向該函數(shù)的指針;但是如果是在支持ES6的環(huán)境中,ES6允許在塊級(jí)作用域內(nèi)聲明函數(shù),此時(shí)在塊級(jí)作用域中聲明的函數(shù),會(huì)提升到所在的塊級(jí)作用域的頭部,值為整個(gè)函數(shù)塊,同時(shí)還會(huì)提升到塊級(jí)作用域外,但是值為undefined。(環(huán)境導(dǎo)致塊級(jí)作用域內(nèi)聲明函數(shù)的行為差異非常大,所以應(yīng)該避免在塊級(jí)作用域內(nèi)聲明函數(shù)。如果確實(shí)需要,也應(yīng)該寫(xiě)成函數(shù)表達(dá)式,而不是函數(shù)聲明語(yǔ)句)

console.log(fn);// ? fn(){}
function fn(){}
console.log(fn);// ? fn(){}

//支持es6的環(huán)境中
console.log(fb);// undefined
if(true){
    console.log(fb); // ? fb(){}
    function fb(){}
}
console.log(fb);// ? fb(){}

console.log(fc);// undefined
if(false){
    console.log(fc); // 未執(zhí)行
    function fc(){}
}
console.log(fc);// undefined
fc() //Uncaught TypeError: fc is not a function

函數(shù)和變量都會(huì)聲明提升,此時(shí)若函數(shù)名和變量名同名,函數(shù)名的優(yōu)先級(jí)要高;但是正式執(zhí)行代碼時(shí),同名函數(shù)會(huì)覆蓋只聲明卻未賦值的變量,但是它不能覆蓋聲明且賦值的變量(原因分析可見(jiàn)另一篇文章JavaScript基礎(chǔ)系列---執(zhí)行環(huán)境與作用域鏈)

console.log(bb);// ? bb(){}
var bb;
function bb(){}
console.log(bb);// ? bb(){}


console.log(cc);// ? cc(){}
var cc = "string";
function cc(){}
console.log(c)c;// string

局部變量/函數(shù)(函數(shù)作用域function塊里面的變量/函數(shù))也會(huì)聲明提升,可以先使用后聲明,不影響外部同名變量/函數(shù)

letconst命令改變了語(yǔ)法行為,它們所聲明的變量一定要在聲明后使用,否則報(bào)錯(cuò)。由于letconst命令在當(dāng)前塊級(jí)作用域內(nèi)不可重復(fù)聲明所以當(dāng)有同名函數(shù)時(shí),會(huì)直接報(bào)錯(cuò)Identifier xx has already been declared

參考資料

《JavaScript高級(jí)程序設(shè)計(jì)第三版》

ECMAScript 6 入門(mén)

MDN變量

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

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

相關(guān)文章

  • JavaScript基礎(chǔ)系列---閉包及其應(yīng)用

    摘要:所以,有另一種說(shuō)法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。所以本文中將以維基百科中的定義為準(zhǔn)即在計(jì)算機(jī)科學(xué)中,閉包,又稱(chēng)詞法閉包或函數(shù)閉包,是引用了自由變量的函數(shù)。 閉包(closure)是JavaScript中一個(gè)神秘的概念,許多人都對(duì)它難以理解,我也一直處于似懂非懂的狀態(tài),前幾天深入了解了一下執(zhí)行環(huán)境以及作用域鏈,可戳查看詳情,而閉包與作用域及作用域鏈的關(guān)系密不可分,所...

    leoperfect 評(píng)論0 收藏0
  • 【重溫基礎(chǔ)】22.內(nèi)存管理

    摘要:內(nèi)存泄露內(nèi)存泄露概念在計(jì)算機(jī)科學(xué)中,內(nèi)存泄漏指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。判斷內(nèi)存泄漏,以字段為準(zhǔn)。 本文是 重溫基礎(chǔ) 系列文章的第二十二篇。 今日感受:優(yōu)化學(xué)習(xí)方法。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】1-14篇 【重溫基礎(chǔ)】15.JS對(duì)象介紹 【重溫基礎(chǔ)】16.JSON對(duì)象介紹 【重溫基礎(chǔ)】1...

    Pandaaa 評(píng)論0 收藏0
  • JavaScript 是如何工作的:JavaScript 的內(nèi)存模型

    摘要:調(diào)用堆棧是存放原始數(shù)據(jù)類(lèi)型的地方除了函數(shù)調(diào)用之外。上一節(jié)中聲明變量后調(diào)用堆棧的粗略表示如下。解釋改變的正確方法是更改內(nèi)存地址。在聲明時(shí),將在調(diào)用堆棧上分配內(nèi)存地址,該值是在堆上分配的內(nèi)存地址。 這是專(zhuān)門(mén)探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 21 篇。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 如果你錯(cuò)過(guò)了前面的章節(jié),可以在這里找到它們:...

    baoxl 評(píng)論0 收藏0
  • 前端每周清單半年盤(pán)點(diǎn)之 JavaScript

    摘要:前端每周清單專(zhuān)注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開(kāi)發(fā)者了解一周前端熱點(diǎn)分為新聞熱點(diǎn)開(kāi)發(fā)教程工程實(shí)踐深度閱讀開(kāi)源項(xiàng)目巔峰人生等欄目。背后的故事本文是對(duì)于年之間世界發(fā)生的大事件的詳細(xì)介紹,闡述了從提出到角力到流產(chǎn)的前世今生。 前端每周清單專(zhuān)注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開(kāi)發(fā)者了解一周前端熱點(diǎn);分為新聞熱點(diǎn)、開(kāi)發(fā)教程、工程實(shí)踐、深度閱讀、開(kāi)源項(xiàng)目、巔峰人生等欄目。歡迎...

    Vixb 評(píng)論0 收藏0
  • JavaScript 是如何工作的:JavaScript 的共享傳遞和按傳遞

    摘要:它對(duì)數(shù)組和對(duì)象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執(zhí)行期間存儲(chǔ)在堆棧中。返回值這是可選的,函數(shù)可以返回值,也可以不返回值。變量被推入堆棧,從而在執(zhí)行時(shí)成為的副本。 這是專(zhuān)門(mén)探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 22 篇。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 如果你錯(cuò)過(guò)了前面的章節(jié),可...

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

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

0條評(píng)論

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