四、變量
變量(Variables),和高中代數學習的x、y、z很像,它們不是字母,而是蘊含值的符號。
它和直接量不同,直接量5,就是數字5;直接量”你好”就是字符串“你好”。現在這個變量不一樣了,你看見一個a,實際上它不是字母a,而是里面蘊含的不同的值。
4.1 整體感知
| 1 <script type="text/javascript"> 2 //定義一個變量 3 var a; 4 //賦值 5 a = 100; 6 //輸出變量a 7 console.log(a); 8 </script> |
我們使用var關鍵字來定義變量,所謂的關鍵字就是一些有特殊功能的小詞語,關鍵字后面要有空格。
var就是英語variables變量的縮寫,表示定義一個變量。一旦你
| 1 var a; |
你的電腦內存中,就會開辟一個空間,來存儲這個變量a。
現在就可以給這個變量賦值,JS中給變量賦值用等號,等號右邊的值賦給左邊。
| 1 a = 100; |
現在a變量的值就是100。所以我們輸出
| 1 console.log(a); |
4.2 變量必須先聲明,才能使用
使用一個變量,必須先進行一個var,才能使用。var這個過程可以叫做聲明declaration,也可以叫做定義definition。
現在我們直接運行語句:
| 1 console.log(b); //這個b沒有被var過,所以要報錯 |

因為b沒有被定義,所以b現在不是一個變量,系統不認識這個b的。拋出引用錯誤。
變量的名稱是標識符(identifiers),任何標識符的命名都需要遵守一定的規則:
在JavaScript語言中,一個標識符(identifier)可以由字母、下划線(_)、美元($)符號、數字(0-9)組成,但不能以數字開頭。也就是說,一個標識符必須由字母、下划線、美元符號開頭,后續可以有字母、下划線、美元符號、數字。因為JavaScript語言是區分大小寫的,所以A和a不是同一個變量。並且不能是JavaScript保留字、關鍵字。
保留字,是系統里面的有用途的字,為了不造成誤會,不能成為標識符的名字。
保留字,不用背:
abstract、boolean、byte、char、class、const、debugger、double、enum、export、extends、fimal、float
goto、implements、import、int、interface、long、mative、package、private、protected、public、short、static、super、synchronized、throws、transient、volatile
合法變量名的舉例:
| 1 // 以下都是合法的變量名 2 var a; 3 var A; 4 var b333; 5 var _abc; 6 var $; 7 var $o0_0o$; 8 var ________; 9 var _; |
非法的:
| 1 var 123a; //不能數字開頭 2 var 12_a; //不能數字開頭 3 var abc@163; //不能有特殊符號,符號只能有_和$ 4 var abc¥; //不能有特殊符號,符號只能有_和$ 5 var var; //不能是關鍵字 6 var class; //不能是保留字 |
變量的名字的長度實際上每個瀏覽器的規范不同,不用在意。
4.3 變量的賦值
變量的賦值用等號,等號就是賦值符號,在JS中等號沒有其他的含義,等號就表示賦值。
| 1 var a; //定義 2 a = 100; //賦初值 3 console.log(a); |
運行結果:

可以定義和賦初值一起寫:
| 1 var a = 100; 2 console.log(a); |
運行結果:

等號右邊的值給左邊,等號右邊的值不變。
| 1 var a = 100; 2 var b = 200; 3 a = b; //在改變a變量的值,a的值變為200。b的值不變。 4 console.log(a); 5 console.log(b); |
運行結果:

你會發現,變量只需要var一次,后面改變變量的值的時候,就不需要var了,可以直接改變它的值。
| 1 var a = 100; 2 a = 50; //不需要寫var 3 console.log(a); |
如果一個變量,僅僅被var了,但是沒有被賦初值呢,此時這個變量的值就是undefined;
| 1 var m; 2 console.log(m); //輸出undefined |
運行結果:

實際上我們已經var了這個m,已經定義了這個m,只不過這就是瀏覽器的一個規矩,如果這個變量沒有被賦初值,那么這個變量就視為沒有“定義完成”。值就是undefined。
4.4 變量聲明的提升
這是js特有的一個特點,其他語言都沒有這個特點。有些程序員挺反感這個特點的。
我們現在先去改變變量的值,然后定義變量,由於JS有一個機制,叫做變量聲明的提升,所以現在程序在執行前會已經看見這個程序中有一行定義變量,所以就會提升到程序開頭去運行。
| 1 <script type="text/javascript"> 2 a = 100; 3 var a; //這行定義變量會自動提升到所有語句之前 4 console.log(a); 5 </script> |

記住,js只能提升變量的聲明,而不能提升變量的賦初值
| 1 console.log(a); 2 var a = 100; |

等價於:
| 1 var a; //自動升級 2 console.log(a); 3 a = 100; //賦初值還留在原地 |
4.5 不寫var的情況
| 1 abc = 123; 2 console.log(abc); |

定義abc的時候沒有寫var,程序沒有報錯,說明這個abc變量真的已經被定義成功了。現在你看不出來var和不var的區別,感覺都是成功的,但是日后你就會知道不寫var定義了一個全局變量,作用域是不能控制的。
4.6 用逗號來隔開多個變量的定義
| 1 var a = 7 , b = 9 , c = 10; |
逗號這個表示法,只能用於變量的連續定義,不要瞎用。
4.7 區分變量還是直接量
變量的時候,不能加引號。如果變量加上引號,就變成字符串了。
| 1 var a = 100; 2 console.log("a"); |

而不是輸出100,
引號是“字符串”的定界符,所以在雙引號里面的a已經失去了變量的意思,就是一個字符串a。
