變量是存儲(chǔ)信息的容器疮茄,在JS中排嫌,變量是松散類(lèi)型的,所以JS中的變量可以用來(lái)保存任何類(lèi)型的數(shù)據(jù)蓬抄。所以變量是沒(méi)有類(lèi)型的,值才有阅爽。
變量標(biāo)識(shí)符
標(biāo)識(shí)符是指變量砰识、函數(shù)和屬性的名字,或者函數(shù)的參數(shù),標(biāo)識(shí)符需要滿足一下條件:
第一個(gè)字符必須是一個(gè)字符突硝、下劃線
_
或一個(gè)美元符號(hào)$
;其他字符可以是字母舟肉、下劃線、美元符號(hào)或數(shù)字;
-
JS中有一組具有特殊用途的關(guān)鍵字剂府,這些關(guān)鍵字可用于表示控制語(yǔ)句的開(kāi)始或結(jié)束痒谴,或者用于執(zhí)行特定操作烦周,這些關(guān)鍵字不可用于標(biāo)識(shí)符饱亿;另外還有一組可能將來(lái)被用作關(guān)鍵字的保留字泵肄,最好也不要用保留字作為標(biāo)識(shí)符胃惜;
var case = 1; // 報(bào)錯(cuò),case為關(guān)鍵字 var char = 2; // 未報(bào)錯(cuò)哪雕,但char為保留字船殉,建議不要用于標(biāo)識(shí)符
定義變量
在JS中變量的定義會(huì)被分為兩步,變量聲明和變量賦值斯嚎。
var a = 1; // 聲明變量并賦值
// 上面可以拆分為兩步
var a; // 變量聲明
a = 1; // 變量賦值
var b; // 聲明變量未賦值利虫,變量值為undefined
上面的代碼我們使用了var
操作符定義變量挨厚,變量將會(huì)作為變量所在作用域中的局部變量。如果在函數(shù)中使用var定義一個(gè)變量列吼,那么這個(gè)變量在函數(shù)退出后將會(huì)被銷(xiāo)毀幽崩。
如果未用var
操作符而直接對(duì)變量進(jìn)行賦值,變量將會(huì)自動(dòng)聲明成為全局變量寞钥,在瀏覽器中全局變量會(huì)作為window對(duì)象的屬性慌申。
a = 1; // 未使用var
window.a // 1
在變量聲明之后再聲明同名變量
var a = 1;
a // 1
var a = 2; // 再次聲明賦值同名變量,變量聲明已經(jīng)有同名的理郑,所以重復(fù)的var聲明被忽略蹄溉,但賦值不會(huì),所以a被賦新值2
a // 2
var a; // 再次聲明同名變量您炉,變量聲明已經(jīng)有同名的柒爵,所以重復(fù)的var聲明被忽略,這條語(yǔ)句無(wú)效
a // 2
變量值的類(lèi)型
JS變量?jī)H僅是一個(gè)保存值的占位符而已赚爵,所以變量的值可以是任何類(lèi)型的數(shù)據(jù)棉胀。
在JS中數(shù)據(jù)有七種內(nèi)置類(lèi)型:空值( null)、未定義( undefined)冀膝、布爾值( boolean)唁奢、數(shù)字( number)、字符串( string)窝剖、對(duì)象( object)麻掸、符號(hào)( symbol, ES6 中新增)赐纱。null脊奋,表示一個(gè)空對(duì)象指針,用于將來(lái)保存對(duì)象但還沒(méi)有真正保存對(duì)象時(shí)疙描,變量初始化的值诚隙;undefined,表示變量已聲明但未初始化賦值起胰;Boolean久又,布爾類(lèi)型,布爾(邏輯)只能有兩個(gè)值:true 或 false待错;string籽孙,字符串是儲(chǔ)存字符的變量烈评;number火俄,數(shù)字類(lèi)型;object讲冠,對(duì)象是一組數(shù)據(jù)和功能的集合瓜客。
var a = 1; // 變量值可以是基本類(lèi)型
a = function () { console.log(2) }; // 修改變量的值為一個(gè)函數(shù)
變量值還有另一種類(lèi)型區(qū)分方式,分為基本類(lèi)型值(如undefined、null谱仪、boolean玻熙、number、string)和引用類(lèi)型值(如object)疯攒。
-
基本類(lèi)型值嗦随,保存在棧內(nèi)存,這種值完全保存在內(nèi)存的一個(gè)位置敬尺;
var a = 1; var b = a; b = 2; a // 1枚尼,基本類(lèi)型值通過(guò)值復(fù)制傳遞,兩個(gè)值之間相互獨(dú)立砂吞,不會(huì)互相影響
-
引用類(lèi)型值署恍,保存在堆內(nèi)存,變量保存的實(shí)際上只是一個(gè)指針蜻直,這個(gè)指針指向內(nèi)存中的一個(gè)位置盯质,該位置保存對(duì)象;
var a = [1]; var b = a; b.push(2); a // [1, 2]概而,引用類(lèi)型通過(guò)引用復(fù)制傳遞呼巷,兩個(gè)變量指向同一個(gè)對(duì)象,會(huì)相互影響