JavaScript 語法 流程控制 Function (函數) Object (物件) 數值 布林值 字串 陣列 時間和日期 Math 物件
正規表示式 瀏覽器物件模型 BOM JS DOM HTML DOM CSS樣式 & Event CSS屬性

JavaScript 語法 JavaScript 語法      資料型態 (Data Types)      運算子 (Operators)

JavaScript 語言 (JavaScript Programming Language)
JavaScript(簡稱JS)是目前廣泛被用於web瀏覽器的腳本語言(scripting language),JavaScript屬於直譯語言 (interpreted language), 不需事先編譯 (compile),直接在瀏覽器(browser)上執行(最常見於web客戶端瀏覽器)。

JavaScript 如何使用

<script>
     // ... JavaScript 程式碼 ... 
  function mOver(xx) { xx.style.color = "red";  xx.innerHTML = "停留在此"}
  function mOut(xx) { xx.style.color = "blue";  xx.innerHTML = "已經移走"}
</script>
<span onmouseover="mOver(this)" onmouseout="mOut(this)" style="background-color:#ee9">
  請移過來
</span>
  
// 網頁呈現如下 :

請移過來

  // this 關鍵字 將本身帶入
       函數的 xx參數
JavaScript 程式碼可以寫在 script 標籤 (HTML tag) 中被瀏覽器執行。而 <script> 標籤可以放在網頁 HTML 的任何地方,像是 <body> 或 <head> 中。 瀏覽器遇到 <script> 標籤時,會停止解析 HTML 文件,來先執行 <script> 裡面的 JS 程式碼,等到執行完程式碼,才會繼續解析接下來的 HTML 文件。

引用 JavaScript 檔案

<script src="JavaScript 檔案位址.js"></script>     註:一般此句是放在 <head> 內
JavaScript 檔案的副檔名,以 .js 結尾。JavaScript 程式碼是寫在 獨立檔案 裡面 ( 檔名.js ),檔名.js 內就不用加上 <script> 標籤喔!
使用完整的 URL連結 : <script src="https://www.w3schools.com/js/myScript.js"></script> 、 使用檔案路徑連結 : <script src="/js/myScript.js"></script>

HTML 檔案路徑

檔案路徑描述了檔案(文件)在網站資料夾結構中的位置 (連結到外部檔案時使用的檔案路徑,外部檔案 例如:網頁、圖片、樣式表.css、JavaScript.js)。
絕對路徑:是檔案的完整 URL → <img src="https://www.w3schools.com/images/picture.jpg">
相對路徑:指向相對於目前頁面的檔案。
   src= "/images/picture.jpg" 指向位於目前網站 根目錄 下的 images資料夾 中的檔案。
   src= "images/picture.jpg" 指向目前資料夾中的 images 資料夾中的檔案。
   src= "../images/picture.jpg" 向目前資料夾上一階資料夾中 images 資料夾中的檔案。

JavaScript 語法

JavaScript 程式指令,稱作語句 (statement),一個程式會由許多語句組成,而瀏覽器會由上至下、由左到右依序執行這些語句。
JavaScript 的每一個語句以分號 ; 來做結束。

註解 (Comment)

寫給開發人員自己看的註釋,註解語法是告訴瀏覽器忽略和不要執行這段語句。
單行註解(雙斜線 // ) 和 多行註解 (用 /* 和 */ 符號, /* 被包住在中間的所有字都是註解 */ )。

JavaScript 輸出 (Output)

JavaScript 可以用不同的方式「顯示」資料:
♦ 寫入到 HTML 元素,使用 innerHTML 或 innerText
    若要存取 HTML 元素,您可以使用 document.getElementById(id) 方法。使用 id屬性來識別 HTML 元素。
    然後使用該 innerHTML屬性來改變 HTML 元素的 HTML 內容。例如: document.getElementById("demo").innerHTML = "<h2> Hello World </h2>";
    而使用該 innerText屬性來改變 HTML 元素的內部文字。例如: document.getElementById("demo").innerText = "Hello World";
♦ 寫入到 HTML 輸出,使用 document.write()。 ( document.write() 方法僅套用於測試,在 HTML文件載入後使用 document.write() 將刪除所有現有的 HTML)
♦ 寫入到 警告框,使用 window.alert()。 (會另外跳出警告框視窗)
  <input type="button" value="按此按鈕 ! 試試看" onClick="alert('開啟的 警告視窗!或提示 ﹗')">  
♦ 寫入到 瀏覽器控制台,使用 console.log()。 (按 F12 開啟主控台視窗,才可見輸出結果。主要是為了調試目的)

   檔案代碼:( 使用 JavaScript 存取和操作 HTML 元素的範例 ) 
<form id="form1" action="#JSoutput">
   <button id="btn" name="按鈕01" type="submit" value="OK" style="color:#a00">
     提交 
   </button>
</form>
<button onclick="disableEmt()"> 禁用上面按鈕 </button>
<button onclick="enableEmt()"> 啟用上面按鈕 </button>
<button onclick="Fn1()"> 取得元素名稱 </button> <span id="d1"></span> <br>
<button onclick="Fn2()"> 取得元素類型 </button> <span id="d2"></span> <br>
<button onclick="Fn3()"> 取得元素的值 </button> <span id="d3"></span> <br>
<button onclick="Fn4()"> 取得元素上的文字 </button> <span id="d4"></span> <br>
<button onclick="Fn5()"> 取得元素的ID </button> <span id="d5"></span> <br>
<button onclick="Fn6()"> 元素所屬表單的ID </button> <span id="d6"></span><br>
<button onclick="Fn7()"> 元素的innerHTML,顯示innerHTML</button>
                            <span id="d7"></span><br>
<button onclick="Fn71()"> 元素的innerText,顯示innerHTML</button>
                            <span id="d71"></span><br>
<button onclick="Fn8()"> 元素的innerText(文字),顯示innerText</button>
                            <span id="d8"></span><br>
<button onclick="Fn81()"> 元素的innerHTML,顯示innerText</button>
                            <span id="d81"></span><br>
<script>
  function disableEmt() {        //禁用元素
    document.getElementById("btn").disabled = true; }
  function enableEmt() {         //啟用元素
    document.getElementById("btn").disabled = false; }
  function Fn1() {               //取得元素名稱
    var x = document.getElementById("btn").name;
    document.getElementById("d1").innerHTML = x; }
  function Fn2() {
    var x = document.getElementById("btn").type;
    document.getElementById("d2").innerHTML = x; }
  function Fn3() {
    var x = document.getElementById("btn").value;
    document.getElementById("d3").innerHTML = x; }
  function Fn4() {
    var x = document.getElementById("btn").innerHTML;
    document.getElementById("d4").innerHTML = x; }
  function Fn5() {
    var x = document.getElementById("btn").id;
    document.getElementById("d5").innerHTML = x; }
  function Fn6() {
    var x = document.getElementById("btn").form.id;
    document.getElementById("d6").innerHTML = x; }
  function Fn7() {         //取得表單id="form1"內的innerHTML,顯示innerHTML
    var x = document.getElementById("form1").innerHTML;
    document.getElementById("d7").innerHTML = x; }
  function Fn71() {        //取得表單id="form1"內的innerText,顯示innerHTML
    var x = document.getElementById("form1").innerText;
    document.getElementById("d71").innerHTML = x; }
  function Fn8() {         //取得表單id="form1"的innerText(文字),顯示innerText
    var x = document.getElementById("form1").innerText;
    document.getElementById("d8").innerText = x; }
  function Fn81() {        //取得表單id="form1"的innerHTML,顯示innerText
    var x = document.getElementById("form1").innerHTML;
    document.getElementById("d81").innerText = x; }
</script>
瀏覽器 網頁呈現:


執行Fn1
執行Fn2
執行Fn3
執行Fn4
執行Fn5
執行Fn6


innerHTML 與 innerText 使用上的區別 :
對於使用者之輸入內容的安全性上來說,似乎以 innerText 操作較為安全。
Fn7
Fn71
Fn8
Fn81

註 : 避免使用危險的DOM操作方法,
  如 innerHTML 和 document.write(),
  這些方法可能無意中執行惡意代碼。
使用更安全的替代方法,例如 textContent 或 innerText。

變數 (variable)

用 var 關鍵字來宣告一個變數,用 = 等號來設定一個值 (value) 給變數,
也可使用 let 關鍵字來宣告一個變數 [ let 關鍵字是在 ES6(2015)中引入的]
 var x;
 x = 100;
也可以在宣告變數的同時 指定值:
 var x = 100;
 JavaScript變數透過3種方式宣告:( var 當須支援舊版瀏覽器時才使用)
      \作用
關鍵字\
Scope
區塊範圍
Redeclare
重新聲明
Reassign
重新分配
Binds this
綁定 this
var
let
const (常量)
取的變數名稱 稱做識別字(identifier),識別字只允許使用字母 a-z A-Z, 數字 0-9, 底線 _ 和錢符號 $
識別字 的開頭 只能是 字母、底線或錢符號,而且大小寫有別的。不能使用JavaScript 的 保留字。

有區分大小寫 (case sensitive)

不像HTML,JavaScript語句是有區分大小寫的,無論是對於變數、函數或物件名稱,如 alert() 寫成 Alert() 是會產生錯誤的。
JavaScript 保留字 是保留來給特殊用途或特定語法使用的,所以不能用來當作 變數名稱,
JavaScript 的保留字有: break case catch const continue debugger default delete do else finally for function if in instanceof new return switch this throw  try typeof var void while with null true false class enum export extends import super  implements interface let package private protected public static yield

運算子 (Operator)

指定運算子 (assignment operator) = 等號,算術運算子 (arithmetic operator) + - * / ( 加、減、乘、除 )

JavaScript 資料型態 (Data Types)

資料型態 說的是一個 變數 (variable) 裡面儲存的是什麼類型的資料 (value)。
在 JavaScript 中,可以分為兩大類資料型態:
第一種是基本資料型態 (primitive data types),基本資料型態包含了:
 布林值 (Boolean) : 只包含兩種值 true / false
 null : null 是一個特殊值 (keyword),表示這變數裡面沒有東西
 undefined : undefined 也是一個特殊值 (keyword),表示值還沒有定義或還未指定
 數值 (Number) : 數值類型的值,像是 42 / 3.14159 / 0
 字串 (String) : 像是 'hello world' / 汽車
 Symbol
第二種是複合資料型態 (composite data types),包含了:
 陣列 (Array) : 陣列用來儲存多個資料,陣列中的資料數量,就是這個陣列的長度 (length)。例如 var cars = ["Saab", "Volvo", "BMW"];
 物件 (Object) : 基本上,基本資料型態以外的都是物件型態

typeof

typeof 運算字用來判斷一個運算元 (operand) 是什麼資料型態。 例如: ( console.log( ) 方法將訊息輸出到控制台。按 F12 開啟主控台視窗,才可見輸出結果。)
 console.log(typeof 'hello');    // 輸出 string 
 console.log(typeof 123);        // 輸出 number 
 console.log(typeof true);       // 輸出 boolean 

指定運算子 (Assignment Operators)

指定運算子 用來指定一個 值 給一個 變數。
運算子 例子 說明
= x = y 將 y 值 指定給 x 變數
+= x += y 意思跟 x = x + y 一樣,將 x y 相加後的值指定回 x 變數
-= x -= y 意思跟 x = x - y 一樣,將 x y 相減後的值指定回 x 變數
*= x *= y 意思跟 x = x * y 一樣,將 x y 相乘後的值指定回 x 變數
/= x /= y 意思跟 x = x / y 一樣,將 x y 相除後的值指定回 x 變數
%= x %= y 意思跟 x = x % y 一樣,將 x 除以 y 的餘數指定回 x 變數
**= x **= y 意思跟 x = x ** y 一樣,將 x 的 y 次方值指定回 x 變數
<<= x <<= y 意思跟 x = x << y 一樣,將 x 所有位元左移 y 位,右邊的位元補入 0 後的值指定回 x 變數
>>= x >>= y 意思跟 x = x >> y 一樣,將 x 所有位元右移 y 位,最左邊的位元 (sign bit) 補入跟原本最左位元一樣值後指定回 x 變數
>>>= x >>>= y 跟 >>= 一樣,但最左邊的位元補 0
&= x &= y 意思跟 x = x & y 一樣,將 x y 做位元 AND 運算後的值指定回 x 變數
^= x ^= y 意思跟 x = x ^ y 一樣,將 x y 做位元 XOR 運算後的值指定回 x 變數
|= x |= y 意思跟 x = x | y 一樣,將 x y 做位元 OR 運算後的值指定回 x 變數

比較運算子 (Comparison Operators)

用來 比較運算子兩邊 運算元 的關係,比較後傳回 true 或 false。運算元可以是數值、字串、表達式 (expression) 或物件等。
對於不同型態的值,JavaScript 會嘗試將他們轉型 (type conversion) 到同樣型態後,再做比較,通常是先轉到數值型態。
運算子 例子 說明
== 3 == var1
'3' == var1
如果兩邊相等就返回 true。 (== 兩個 =號)
!= var1 != 4
var2 != '3'
如果兩邊不相等就返回 true
=== 3 === var1 跟 == 的差異在於,=== 不會自動嘗試轉型,型態和值都一樣才會返回 true。 (=== 三個 =號)
!== var1 !== '3'
3 !== '3'
跟 != 的差異在於,!== 不會自動嘗試轉型,型態或值不一樣都會返回 true
> var2 > var1
var1 > 2
如果左邊運算元大於右邊的就返回 true
>= var2 >= var1
var1 >= 3
如果左邊運算元大於或等於右邊的就返回 true
< var2 < var1
var1 < 2
如果左邊運算元小於右邊的就返回 true
<= var2 <= var1
var1 <= 3
如果左邊運算元小於或等於右邊的就返回 true

算術運算子 (Arithmetic Operators)

算術運算子用來做常見的數值運算。
運算子 例子 說明
+ var1 + 10 加法
- var1 - var2 減法
* 10 * 10 乘法
/ var1 / 10 除法
% 12 % 5 (餘數) 模數運算子 (Remainder),以某運算式的值除以另一個運算式的值,並傳回餘數。12 % 5 等於 2
++ ++10
++x
x++
遞增運算子 (Increment),每次將變數的值加一。
如果運算子在變數之前,則會在執行運算式之前修改值。如果運算子在變數之後,則會在執行運算式之後修改值。
例1: ++10 等於 11
例2: j = ++k 則 j 的值是 k 的原始值加一
例3: j = k++ 則 j 的值是 k 的原始值,k 會在其值指派給 j 之後遞增
-- --10
--x
x--
遞減運算子 (Decrement),每次將變數的值減一。
如果運算子在變數之前,則會在執行運算式之前修改值。如果運算子在變數之後,則會在執行運算式之後修改值。
例1: --10 等於 9
例2: j = --k 則 j 的值是 k 的原始值減一
例3: j = k-- 則 j 的值是 k 的原始值,k 會在其值指派給 j 之後遞減
- -x
-3
一元負運算子 (Unary negation),例如 -x 如果 x 是 3 則 -x 就是負數 3
+ +3
+true
一元正運算子 (Unary plus),用在數值上沒啥意義;通常用來做型別轉換,將運算元轉成數值型態。例如 +true 會將布林值 true 轉型成數值 1

邏輯運算子 (Logical Operators)

邏輯運算子用來做布林值 (boolean) 的運算,運算結果傳回 true 或 false。
在真假判斷式中,所有東西都可以轉換為布林值,而除了 null, 數值 0, NaN, 空字串 '' 和 undefined 是 false,其他的值都是 true。
運算子 例子 說明
&& expr1 && expr2 Logical AND,如果 expr1 和 expr2 都是 true,就會傳回 true, 否則傳回 false
|| expr1 || expr2 Logical OR,如果 expr1 或 expr2 是 true,就會傳回 true,否則傳回 false
! !expr Logical NOT,如果 expr 是 true,就傳回 false,否則傳回 true
但 && 和 || 還有比較特別的地方,如果運算元的值 不是 布林值,實際上會傳回其中一個運算元的值,看下面 例子:
var foo = 'Cat' && 'Dog';  // foo 是 Dog
var foo = false && 'Cat';  // foo 是 false // 因為 && 遇到 false 的運算元,就會直接返回,不會繼續再往下判斷
var foo = 'Cat' || 'Dog';  // foo 是 Cat // 因為 || 遇到 true 的運算元,就會直接返回,不會繼續再往下判斷
var foo = false || 'Cat';  // foo 是 Cat

位元運算子 (Bitwise Operators)

用來做二進制的位元運算,位元運算子會將運算元看作 32 bits 位元來做運算,然後運算完後會返回數值型態的結果。
運算子 例子 binary 運算 結果 說明
& 15 & 9 1111 & 1001 = 1001 9 Bitwise AND 運算,如果兩個位元都是 1,結果就是 1,否則是 0
| 15 | 9 1111 | 1001 = 1111 15 Bitwise OR 運算,如果任何一個位元是 1,結果就是 1,否則是 0
^ 15 ^ 9 1111 ^ 1001 = 0110 6 Bitwise XOR 運算,如果位元不相同,結果是 1,否則是 0
~ ~15 ~00000000...00001111 = 11111111...11110000 -16 Bitwise NOT 運算,將所有位元的 0 變成 1,1 變成 0

Bitwise shift 運算子: (9 的二進制是 1001)
運算子 例子 說明
<< 9 << 2 = 36 左移運算 (Left shift),將所有位元向左移 n 個位置,右邊的位元補入 0
>> 9 >> 2 = 2 右移運算 (Sign-propagating right shift),將所有位元向右移 n 個位置,最左邊的位元 (sign bit) 補入跟原本最左位元一樣值,保持正負數一致
>>> 19 >>> 2 = 4 補零右移 (Zero-Fill Right Shift),跟 >> 一樣,但最左邊的位元補 0

三元運算子 (Conditional (ternary) operator)

condition ? val1 : val2
如果 condition 是 true, 就傳回 val1 的結果,否則傳回 val2 的結果。 例如:
  var status = (age >= 18) ? 'adult' : 'minor';  // 如果 age 變數大於等於 18,則 status 就會是 adult ; 反之,如果 age 變數小於 18,則 status 就會是 minor

運算子優先權 (Operator precedence)

各種運算子在處理上的優先次序 (precedence) 是依一般算術規則,先乘除後加減,如果你有一些運算要優先處理,可以放在 () 小括號裡面,例如:
 100 + 50 / 2 = 125  ,  (100 + 50) / 2 = 75
這邊整理出 JavaScript 各種運算子的優先權,由高至低排列:
運算子 優先權
member .  [ ]
call / create instance ( )  new
negation/increment !  ~  -  +  ++  --  typeof  void  delete
multiply/divide *  /  % 
addition/subtraction +  -
bitwise shift <<  >>  >>>
relational <  <=  >  >=  in  instanceof
equality ==  !=  ===  !==
bitwise-and &
bitwise-xor ^
bitwise-or \
logical-and &&
logical-or ||
conditional ?:
assignment =  +=  -=  *=  /=  %=  <<=  >>=  >>>=  &=  ^=
comma ,