變數是值的容器,就像我們可能在總和中使用的數字,或者我們可能用作句子一部分的字符串。
//引述自 MDN Web docs
我們在寫出各種程式時,我們會需要一個空間來儲存各種我們所需要的資料,那就是變數(variable)。
而變數的資料型別指的是:那個變數是什麼種類的值。例如我們可以有數字(number)的42
和字串(string)的'42'
,雖然看起來好像一樣,但他們屬於不同的資料型別。
JavaScript是屬於動態型別(Dynamic type),他在執行時才確定其資料型別,變數使用之前不需要型別宣告,變數的型別就是被賦值的那個值的型別。因此在Javascript裡的變數宣告,我們可以從頭到尾只使用一種宣告方式 : var
//var varName = varValue;
//JavaScript
var num = 42; // number(數字)
var str = "Hello World!"; // string(字串)
str = 100; // 變數str重新賦值為100,型態從 string 改變為 number
console.log(str); // 100
對比一下,屬於靜態型別(Static type)的C++,就需要各種不同的型別宣告:
//C++
int i = 42; // integer(整數)
char ch[] = "Hello World!"; // character array(字元陣列)
ch = 100; // 嘗試將 100 從 int 轉型到 char[13] ,但無法轉型導致出錯。
/* Error: incompatible types in assignment of 'int' to 'char[13]' */
std::cout << ch ;
我們可以看到JavaScript在我們給他不屬於原本型別的值,在賦值時會直接變為那個值的型別(上例為 number),而 C++ 則會嘗試將值轉型為原本該變數的型別,不會因為 100 屬於 int 而影響到 ch 的型別。
談到了轉型,我們也要了解JavaScript是屬於較為弱型別(Weakly-typed)的語言,一個變數在與不同型別的變數或值做運算時,可以自動轉型。
我們來看看以下的例子:
//JavaScript
var hello = "Hello World!" + 42; // string(字串) + number(數字)
console.log(hello); // 輸出 Hello World!42
可以看到 42 被自動轉型為 string 了。而 C++ 則會不知道該怎麼樣將整數和字元陣列加在一起。而出現Error: incompatible types in assignment of 'int' to 'char[]'
。
既然會自動轉型,那他是怎麼運作的呢?
例如:'1'+2
答案會是多少?是 3
還是 '12'
?
當字串和數字相加時,JavaScript 傾向將 +
認為是 Concatenation Operators (串接運算子) 而不是 Arithmetic Operators (算數運算子)。
所以答案是 --- '12'
。
而 JavaScript 在型別轉換上預設的潛規則有很多,因此各種型別做運算他都會幫你轉換,這很方便,但很可能不會按你所想的進行,所以要小心。
前面已經提到了 number (數字)和 string (字串) 這兩種型別,還有二元值的 Boolean (只有 true 和 false 兩種值),當然還有Function (函數)、Array (陣列)...等等?
我們來整理一張表吧:
他們分別是6種基本型別( primitives )和物件型別( object ),JavaScript 的任何東西(除了基本型別以外)都是物件,要注意基本型別和物件型別的子型別裡雖然有一樣名稱的東西,不過那其實是有所區別的,物件型別名稱的第一個字母我們把他標為大寫,以示分別。
物件在 JavaScript 裡就是名稱和值的組合( Name/Value pairs )。就像是如此:
var myObj1 = {
int1 : 50,
int2 : 60,
str : 'Hello World!',
checkSomething : true
}; // 字面表達語法 ( literal syntax )
console.log(myObj1['int1']); // 50
// 括弧記法 (Bracket notation)
console.log(myObj1.int2); // 60
// 點記法 (Dot notation)
var myObj2 = new Object(); // 也可以這樣建立物件
我們可以看到, Array 在 JavaScript 中,其實是一種 Object 。仔細一觀察,還可以看到他們相似之處呢!
var myArr1 = [50,60,'Hello World!',true]; // 字面表達語法 ( literal syntax )
console.log(myArr1[0]); // 50
var myArr2 = new Array(); // 也可以這樣建立陣列
很多東西覺得自己應該算懂了,但在寫的時候會發現有些細節還是沒那麼確定,在考據資料時還是花了不少時間。更有些地方在琢磨要多寫一點內容,還是在躊躇略過一些地方,果然撰寫成文章沒這麼容易的啊!糟糕了 0 存稿會不會太 hardcore 了一點 ... (誰叫你不先寫