iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 2
0
自我挑戰組

跟著新手一起玩Javascript!系列 第 2

DAY2 - JavaScript概念 - 變數的宣告與型別

  • 分享至 

  • xImage
  •  

變數是值的容器,就像我們可能在總和中使用的數字,或者我們可能用作句子一部分的字符串。
//引述自 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 在型別轉換上預設的潛規則有很多,因此各種型別做運算他都會幫你轉換,這很方便,但很可能不會按你所想的進行,所以要小心。

JavaScript的型別

前面已經提到了 number (數字)和 string (字串) 這兩種型別,還有二元值的 Boolean (只有 true 和 false 兩種值),當然還有Function (函數)、Array (陣列)...等等?

我們來整理一張表吧:

  1. number (數字)
  2. string (字串)
  3. boolean (布林)
  4. object (物件)
    • Function (函數/函式)
    • Array (陣列)
    • Date (日期)
    • RegExp (正規表達式)
    • Number (數字物件)
    • String (字串物件)
    • ……其他等等等
  5. null (空值)
  6. undefined (未定義)
  7. symbol

他們分別是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 了一點 ... (誰叫你不先寫


上一篇
DAY1 開始玩JavaScript吧!
下一篇
DAY3 - 遊戲實作 - 猜數字遊戲 (條件式)
系列文
跟著新手一起玩Javascript!4
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言