1.1變量的聲明
要在程序中使用變量,就必須從聲明變量學起,因為Javascript語法與我們基礎的其他程序語言聲明變量的方法略有不同,但是Javascript語法的變量應用非常強大,使用也非常簡單。
1.1.1聲明和命名變量
要使用變量,就必須聲明變量,可以使用關鍵字var來聲明,如果不使用var關鍵字可能會導致程序不易閱讀。變量區分大小寫。
基本的規則:var 變量名;
(1)聲明一個變量名:var firstName;
(2)聲明多個變量名,用逗號分隔:var firstName,middleName,lastName;
(3)在聲明變量時直接為變量賦值:var firstName = "chengmingxiaowu";
(4)一條語句聲明多個變量,同時為這些變量賦值:var firstName="chengming",middleName="xiao",lastName="wu";
1.1.2變量和標識符的命名規范
變量名必須是一個js標識符,遵循以下標准命名規則
(1)第一個字符必須為字母,下划線(_)或者美元符號($);
(2)后面可以跟字母、下划線、美元符號、數字,最好不要包含其他符號。
(3)變量名不能是一個關鍵字或者邏輯常量。(true,null,false,underfind)
(4)變量名在其作用范圍內必須是唯一的。
tip:使用錯誤的變量名在執行時就會導致錯誤,但是大多數瀏覽器不會提示這種語法錯誤。
1.1.3
數據類型可分為簡單數據類型和復雜數據類型
一、簡單的
數據類型 | 取值范圍 |
Boolean | true或false。 js也會在適當的時候將值轉換為1和0。 |
Number | 雙精度浮點型。 兩個數字常量: (1)Infinity表示無窮大 (2)NaN表示非數字 |
String | 表示一個字符序列,一般使用雙引號或者單引號包圍。除了內存限制以外,對其長度沒有限制。 |
Underfind | Underfind數值類型僅有一個值,與類型名相同,注意區分大小寫。 當定義了一個變量而未為該變量賦值時,該變量就是underfind. |
Null | Null數值類型僅有一個值,與類型名相同,注意區分大小寫。 當一個用於引用某個對象的變量不再使用時,就可以為該變量賦值為null, 從而該變量就不再引用那個對象了,該變量的值就是空引用。 使用情況: (1)聲明變量還沒有接收到值; (2)聲明變量不再包含值; (3)作為函數的返回值,表明很熟沒有可以返回的值; (4)作為函數的一個參數,表明省略了一個參數。 |
二、復雜數據類型
(1)Array數據類型
Array為數組變量,數組可以是連續數字索引的數組也可以是符合數組,並且數組元素的數據類型也可以多種多樣。
(2)Object數據類型
Object是屬性的集合,屬性是用來描述對象特性的。
1.1.4自定義常量和內建常量
常量也是變量,但它是一個用於表示其值永遠不會改變的變量。
用戶可以使用const關鍵字自定義常量;開發可以使用con_或者大寫所有的常量名來區分常量和變量。(IE中的常量定義不生效,所以不推薦自定義的常量。)
以下是常量表:
常量 | 說明 |
false | 一個表示與true相反的唯一邏輯值,表示邏輯假 |
Infinity | 表示正無窮大 IEEE-754值 |
-Infinity | 表示負無窮大的IEEE-754值 |
NaN | 一個預定義的變量 |
null | 一個可以分配給變量的或由未提供數據的函數返回的特殊值。 |
true | 一個表示與false相反的唯一邏輯值,表示邏輯真 |
undefind | 一個特殊值,通常用於指示變量尚未賦值。 將underfind用於不同的類型轉換函數時,結果也不相同: (1)String 返回的是 underfind, 轉換為字符串。 (2)Nunber返回的是NaN; (3)Object返回的值為新的Object實例;該實例的屬性如果沒有初始化,那么其屬性值為underfind,而非null, 因為Object並非動態類。 (4)向類型變量賦予值underfind時,改值轉換為該數據類型的默認值。 |
Tip:null==underfind是true;null===underfind是false;
1.2在程序中使用變量
1.2.1為變量賦值和更改變量值:
1、為變量值賦值,1.1中已經介紹,注意點:
1)在位現有的變量重新賦值時,無需使用var關鍵字;
2)不用var關鍵字申明的隱式變量具有全局作用,是全局變量;
2、變量值包含引號:若在變量值中包含引號(雙引號或者單引號),就必須用轉義符(\);但是如果二者交替出現,則無需使用‘\’;
如: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、數據類型的轉換:只需為變量賦一個不同類型的值即可。
5、變量的默認值:如果定義了一個變量,但是沒有賦值,則運行環境會為其指定一個默認值,這個默認值為underfind。
1.2.2使用變量和獲取變量值
變量的值可以相互傳遞,也可以作為函數的參數被處理,或者被直接顯示在網頁上。
1、變量申明的順序:先申明后使用;不申明就會報錯。
2、變量申明的提升:先使用后申明,申明會自動提升到最頂部,但是卻不能將賦值語句提到頂部,所以會返回該變量對應數據類型的默認值。(雖合法,但不推薦。)
1.3變量的傳值和傳址
1.3.1傳值變量-按值傳遞
簡單數據類型是按值進行傳遞的, 這種傳遞類型被成為傳值。當按值傳遞時,將在計算機內存中分配一塊空間並將原復制到其中,是相互獨立的實體。
var i=10;
var j=i;
alert(j)//輸出15
i=30;
alert(j)//輸出15
1.3.2傳址變量-按引用傳遞
復雜數據類型可以包含大量和復雜的信息,所以屬於此類型的變量並不包含實際的值,它包含的是對值的引用,這種傳遞類型稱為傳址。
(這種引用類似於指向變量名的別名,在一些程序語言中稱為指針)
var myArry = ["chengming","xiaowu"];
var newArry = myArry;
alert(newArry[1])//返回xiaowu
myArry[1]="xiaowushi";
alert(newArry[1])//返回xiaowushi
1.4內存使用規則-堆和棧
堆和棧都是運行時內存中分配的一個數據去,因此也被成為堆區和棧區,但二者存儲的數據類型和處理速度不同。
(1)堆(heap):用於復雜數據類型的分配空間,例如數組對象,Object對象。它在運行時動態分配內存的,因此存取速度比較慢。
(2)棧(stack):主要存放一些基本類型的變量和對象的引用。優勢速度快,數據共享。缺點:棧中數據大小與生存期是確定的,缺乏靈活性。
1.4.1 棧的使用規則:
var a=3 首先會在棧中創建一個變量為a的引用,然后查找棧中是否有3這個值,沒有找到,就將3存放進來,然后指向a,接着處理var b=3,在創建完b的引用變量后,直接查找棧中是否有3這個值,因為存在,所以直接指向b 。這樣就出現a和b同時指向3的情況。
此時如果a=4,那么js引擎就會重新搜索棧中是否有4,如果沒有,存放起來,並a指向4,如果已經有了,就指向這個地址,因此a值的改變不會影響到b值。
1.4.2堆的使用:
當創建數組時,就會在堆內創建一個數組對象,並且在棧內創建一個對數組的引用。
js堆不需要程序代碼來顯示的釋放,因為堆是由自動的垃圾回收來負責的,各種引擎各不相同,但最基本的原則是,如果占中不存在對堆中某個對象堆的引用,那么就會認為該對象已經不再需要,在垃圾回收時就會清除該對象占用的空間。
因此,在不需要的時候應該對對象的引用釋放掉,以利於垃圾回收。這樣可以提高性能。最常用的方法就是為其賦值null。
1.4.3易犯的錯誤
在堆和棧的使用問題上,最易犯錯誤的就是String的使用,例如:
var str1 = new String("abc"); //存放在堆中
var str2 = "abc";//存放在棧中
下面進行邏輯運算來深入了解以下:
(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)一個存放在堆中,一個棧中
var str1 = "abc";
var str2 = new String("abc");
alert(str1==str2);//true 在進行邏輯等於運算時,會首先將變量轉換成相同的數據類型,然后進行對比。
alert(str1===str2);//false
1.5數據類型的轉換
在js中,有時進行數據運算前會對數據類型進行轉換,分為兩種
(1)強制數據轉換。
可以使用全局函數進行數據類型轉換,這些函數包括parseFloat()、parseInt()、Number()、String()和Boolean()函數。
(2)隱式數據類型轉換,比如賦值的時候。