1.1變量的聲明
要在程序中使用變量尚卫,就必須從聲明變量學(xué)起酪捡,因?yàn)镴avascript語(yǔ)法與我們基礎(chǔ)的其他程序語(yǔ)言聲明變量的方法略有不同,但是Javascript語(yǔ)法的變量應(yīng)用非常強(qiáng)大纳账,使用也非常簡(jiǎn)單逛薇。
1.1.1聲明和命名變量
要使用變量,就必須聲明變量疏虫,可以使用關(guān)鍵字var來(lái)聲明永罚,如果不使用var關(guān)鍵字可能會(huì)導(dǎo)致程序不易閱讀啤呼。變量區(qū)分大小寫(xiě)。
基本的規(guī)則:var 變量名呢袱;
(1)聲明一個(gè)變量名:var firstName;
(2)聲明多個(gè)變量名官扣,用逗號(hào)分隔:var?firstName,middleName,lastName;
(3)在聲明變量時(shí)直接為變量賦值:var firstName = "chengmingxiaowu";
(4)一條語(yǔ)句聲明多個(gè)變量,同時(shí)為這些變量賦值:var?firstName="chengming",middleName="xiao",lastName="wu";
1.1.2變量和標(biāo)識(shí)符的命名規(guī)范
變量名必須是一個(gè)js標(biāo)識(shí)符羞福,遵循以下標(biāo)準(zhǔn)命名規(guī)則
(1)第一個(gè)字符必須為字母惕蹄,下劃線(_)或者美元符號(hào)($);
(2)后面可以跟字母、下劃線治专、美元符號(hào)卖陵、數(shù)字,最好不要包含其他符號(hào)张峰。
(3)變量名不能是一個(gè)關(guān)鍵字或者邏輯常量泪蔫。(true,null,false,underfind)
(4)變量名在其作用范圍內(nèi)必須是唯一的。
tip:使用錯(cuò)誤的變量名在執(zhí)行時(shí)就會(huì)導(dǎo)致錯(cuò)誤喘批,但是大多數(shù)瀏覽器不會(huì)提示這種語(yǔ)法錯(cuò)誤撩荣。
1.1.3
數(shù)據(jù)類(lèi)型可分為簡(jiǎn)單數(shù)據(jù)類(lèi)型和復(fù)雜數(shù)據(jù)類(lèi)型
一、簡(jiǎn)單的
數(shù)據(jù)類(lèi)型取值范圍
Booleantrue或false饶深。
js也會(huì)在適當(dāng)?shù)臅r(shí)候?qū)⒅缔D(zhuǎn)換為1和0餐曹。
Number雙精度浮點(diǎn)型。
兩個(gè)數(shù)字常量:
(1)Infinity表示無(wú)窮大
(2)NaN表示非數(shù)字
String表示一個(gè)字符序列粥喜,一般使用雙引號(hào)或者單引號(hào)包圍凸主。除了內(nèi)存限制以外,對(duì)其長(zhǎng)度沒(méi)有限制额湘。
UnderfindUnderfind數(shù)值類(lèi)型僅有一個(gè)值卿吐,與類(lèi)型名相同,注意區(qū)分大小寫(xiě)锋华。
當(dāng)定義了一個(gè)變量而未為該變量賦值時(shí)嗡官,該變量就是underfind.
NullNull數(shù)值類(lèi)型僅有一個(gè)值,與類(lèi)型名相同毯焕,注意區(qū)分大小寫(xiě)衍腥。
當(dāng)一個(gè)用于引用某個(gè)對(duì)象的變量不再使用時(shí),就可以為該變量賦值為null,
從而該變量就不再引用那個(gè)對(duì)象了纳猫,該變量的值就是空引用婆咸。
使用情況:
(1)聲明變量還沒(méi)有接收到值;
(2)聲明變量不再包含值芜辕;
(3)作為函數(shù)的返回值尚骄,表明很熟沒(méi)有可以返回的值;
(4)作為函數(shù)的一個(gè)參數(shù)侵续,表明省略了一個(gè)參數(shù)倔丈。
二憨闰、復(fù)雜數(shù)據(jù)類(lèi)型
(1)Array數(shù)據(jù)類(lèi)型
Array為數(shù)組變量,數(shù)組可以是連續(xù)數(shù)字索引的數(shù)組也可以是符合數(shù)組需五,并且數(shù)組元素的數(shù)據(jù)類(lèi)型也可以多種多樣鹉动。
(2)Object數(shù)據(jù)類(lèi)型
Object是屬性的集合,屬性是用來(lái)描述對(duì)象特性的宏邮。
1.1.4自定義常量和內(nèi)建常量
常量也是變量泽示,但它是一個(gè)用于表示其值永遠(yuǎn)不會(huì)改變的變量。
用戶可以使用const關(guān)鍵字自定義常量蜀铲;開(kāi)發(fā)可以使用con_或者大寫(xiě)所有的常量名來(lái)區(qū)分常量和變量边琉。(IE中的常量定義不生效,所以不推薦自定義的常量记劝。)
以下是常量表:
常量說(shuō)明
false一個(gè)表示與true相反的唯一邏輯值变姨,表示邏輯假
Infinity表示正無(wú)窮大 IEEE-754值
-Infinity表示負(fù)無(wú)窮大的IEEE-754值
NaN一個(gè)預(yù)定義的變量
null一個(gè)可以分配給變量的或由未提供數(shù)據(jù)的函數(shù)返回的特殊值。
true一個(gè)表示與false相反的唯一邏輯值厌丑,表示邏輯真
undefind一個(gè)特殊值定欧,通常用于指示變量尚未賦值。
將underfind用于不同的類(lèi)型轉(zhuǎn)換函數(shù)時(shí)怒竿,結(jié)果也不相同:
(1)String 返回的是 underfind, 轉(zhuǎn)換為字符串砍鸠。
(2)Nunber返回的是NaN;
(3)Object返回的值為新的Object實(shí)例;該實(shí)例的屬性如果沒(méi)有初始化耕驰,那么其屬性值為underfind,而非null,
因?yàn)镺bject并非動(dòng)態(tài)類(lèi)爷辱。
(4)向類(lèi)型變量賦予值underfind時(shí),改值轉(zhuǎn)換為該數(shù)據(jù)類(lèi)型的默認(rèn)值朦肘。
Tip:null==underfind是true;null===underfind是false;
1.2在程序中使用變量
1.2.1為變量賦值和更改變量值:
1饭弓、為變量值賦值,1.1中已經(jīng)介紹媒抠,注意點(diǎn):
1)在位現(xiàn)有的變量重新賦值時(shí)弟断,無(wú)需使用var關(guān)鍵字;
2)不用var關(guān)鍵字申明的隱式變量具有全局作用趴生,是全局變量阀趴;
2、變量值包含引號(hào):若在變量值中包含引號(hào)(雙引號(hào)或者單引號(hào))苍匆,就必須用轉(zhuǎn)義符(\)刘急;但是如果二者交替出現(xiàn),則無(wú)需使用‘\’浸踩;
如:var myName="my name is \"chengmingxiaowu\",thank you!";
var?myName="my name is 'chengmingxiaowu',thank you!";
var?myName='my name is "chengmingxiaowu",thank you!';
3叔汁、更改變量值:只需為該變量重新賦值即可。
var? myName = "chengmingxiaowu";
myName = "xiaowu";
4、數(shù)據(jù)類(lèi)型的轉(zhuǎn)換:只需為變量賦一個(gè)不同類(lèi)型的值即可攻柠。
5、變量的默認(rèn)值:如果定義了一個(gè)變量后裸,但是沒(méi)有賦值瑰钮,則運(yùn)行環(huán)境會(huì)為其指定一個(gè)默認(rèn)值,這個(gè)默認(rèn)值為underfind微驶。
1.2.2使用變量和獲取變量值
變量的值可以相互傳遞浪谴,也可以作為函數(shù)的參數(shù)被處理,或者被直接顯示在網(wǎng)頁(yè)上因苹。
1苟耻、變量申明的順序:先申明后使用;不申明就會(huì)報(bào)錯(cuò)扶檐。
2凶杖、變量申明的提升:先使用后申明,申明會(huì)自動(dòng)提升到最頂部款筑,但是卻不能將賦值語(yǔ)句提到頂部智蝠,所以會(huì)返回該變量對(duì)應(yīng)數(shù)據(jù)類(lèi)型的默認(rèn)值。(雖合法奈梳,但不推薦杈湾。)
1.3變量的傳值和傳址
1.3.1傳值變量-按值傳遞
簡(jiǎn)單數(shù)據(jù)類(lèi)型是按值進(jìn)行傳遞的, 這種傳遞類(lèi)型被成為傳值攘须。當(dāng)按值傳遞時(shí)漆撞,將在計(jì)算機(jī)內(nèi)存中分配一塊空間并將原復(fù)制到其中,是相互獨(dú)立的實(shí)體于宙。
var i=10;
var j=i;
alert(j)//輸出15
i=30;
alert(j)//輸出15
1.3.2傳址變量-按引用傳遞
復(fù)雜數(shù)據(jù)類(lèi)型可以包含大量和復(fù)雜的信息浮驳,所以屬于此類(lèi)型的變量并不包含實(shí)際的值,它包含的是對(duì)值的引用限煞,這種傳遞類(lèi)型稱(chēng)為傳址抹恳。
(這種引用類(lèi)似于指向變量名的別名,在一些程序語(yǔ)言中稱(chēng)為指針)
var myArry = ["chengming","xiaowu"];
var newArry = myArry;
alert(newArry[1])//返回xiaowu
myArry[1]="xiaowushi";
alert(newArry[1])//返回xiaowushi
1.4內(nèi)存使用規(guī)則-堆和棧
堆和棧都是運(yùn)行時(shí)內(nèi)存中分配的一個(gè)數(shù)據(jù)去署驻,因此也被成為堆區(qū)和棧區(qū)奋献,但二者存儲(chǔ)的數(shù)據(jù)類(lèi)型和處理速度不同。
(1)堆(heap):用于復(fù)雜數(shù)據(jù)類(lèi)型的分配空間旺上,例如數(shù)組對(duì)象瓶蚂,Object對(duì)象。它在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存的宣吱,因此存取速度比較慢窃这。
(2)棧(stack):主要存放一些基本類(lèi)型的變量和對(duì)象的引用。優(yōu)勢(shì)速度快征候,數(shù)據(jù)共享杭攻。缺點(diǎn):棧中數(shù)據(jù)大小與生存期是確定的祟敛,缺乏靈活性。
1.4.1 棧的使用規(guī)則:
var a=3 首先會(huì)在棧中創(chuàng)建一個(gè)變量為a的引用兆解,然后查找棧中是否有3這個(gè)值馆铁,沒(méi)有找到,就將3存放進(jìn)來(lái)锅睛,然后指向a,接著處理var b=3埠巨,在創(chuàng)建完b的引用變量后,直接查找棧中是否有3這個(gè)值现拒,因?yàn)榇嬖诶崩荩灾苯又赶騜 。這樣就出現(xiàn)a和b同時(shí)指向3的情況印蔬。
此時(shí)如果a=4勋桶,那么js引擎就會(huì)重新搜索棧中是否有4,如果沒(méi)有侥猬,存放起來(lái)哥遮,并a指向4,如果已經(jīng)有了陵究,就指向這個(gè)地址眠饮,因此a值的改變不會(huì)影響到b值。
1.4.2堆的使用:
當(dāng)創(chuàng)建數(shù)組時(shí)铜邮,就會(huì)在堆內(nèi)創(chuàng)建一個(gè)數(shù)組對(duì)象仪召,并且在棧內(nèi)創(chuàng)建一個(gè)對(duì)數(shù)組的引用。
js堆不需要程序代碼來(lái)顯示的釋放松蒜,因?yàn)槎咽怯勺詣?dòng)的垃圾回收來(lái)負(fù)責(zé)的扔茅,各種引擎各不相同,但最基本的原則是秸苗,如果占中不存在對(duì)堆中某個(gè)對(duì)象堆的引用召娜,那么就會(huì)認(rèn)為該對(duì)象已經(jīng)不再需要,在垃圾回收時(shí)就會(huì)清除該對(duì)象占用的空間惊楼。
因此玖瘸,在不需要的時(shí)候應(yīng)該對(duì)對(duì)象的引用釋放掉,以利于垃圾回收檀咙。這樣可以提高性能雅倒。最常用的方法就是為其賦值null。
1.4.3易犯的錯(cuò)誤
在堆和棧的使用問(wèn)題上弧可,最易犯錯(cuò)誤的就是String的使用蔑匣,例如:
var str1 = new String("abc"); //存放在堆中
var str2 = "abc";//存放在棧中
下面進(jìn)行邏輯運(yùn)算來(lái)深入了解以下:
(1)存放在棧中
var str1 = "abc";
var str2 = "abc";
alert(str1==str2);//true
alert(str1===str2);//true
(2)存放在堆中
var str1 = new String("abc");
var str2 = new String("abc");
alert(str1==str2);//false
alert(str1===str2);//false
(3)一個(gè)存放在堆中,一個(gè)棧中
var str1 = "abc";
var str2 = new String("abc");
alert(str1==str2);//true 在進(jìn)行邏輯等于運(yùn)算時(shí),會(huì)首先將變量轉(zhuǎn)換成相同的數(shù)據(jù)類(lèi)型裁良,然后進(jìn)行對(duì)比凿将。
alert(str1===str2);//false
1.5數(shù)據(jù)類(lèi)型的轉(zhuǎn)換
在js中,有時(shí)進(jìn)行數(shù)據(jù)運(yùn)算前會(huì)對(duì)數(shù)據(jù)類(lèi)型進(jìn)行轉(zhuǎn)換价脾,分為兩種
(1)強(qiáng)制數(shù)據(jù)轉(zhuǎn)換丸相。
可以使用全局函數(shù)進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換,這些函數(shù)包括parseFloat()彼棍、parseInt()、Number()膳算、String()和Boolean()函數(shù)座硕。
(2)隱式數(shù)據(jù)類(lèi)型轉(zhuǎn)換,比如賦值的時(shí)候涕蜂。