Skip to content

Javascript簡介

簡介

Js 1995年被創造用於寫網頁、隔年被改良為 scripting language
ECMA-262 規範了JS的語法規則
ES6是整個規範最大的改動 ,例如加入OOP的概念
本質上很"安全”(不會碰記憶體等核心)
同時JS能與HTML、CSS整合、相對簡單,並且被大多數瀏覽器支持

JS遵從ECMAScript標準

JS 是直譯、動態(runtime才檢查)、弱型別(隱轉)語言

  • Note:Scripting language是為了縮短傳統的「編寫、編譯、連結、執行」(edit-compile-link-run)過程而建立的
    參考: https://zh.wikipedia.org/wiki/%E8%84%9A%E6%9C%AC%E8%AF%AD%E8%A8%80

  • Note: browser通常都內建JS的虛擬引擎
    如: chorme是V8 Firefox是SpiderMonkey

  • Note: 引擎大概的工作是 解析script > 編譯成機器碼 > 執行機器碼

在browser中JS

與使用者、伺服端互動溝通
比如:

  • 改動HTML tag、CSS style
  • 回應使用者 如:滑鼠點擊
  • 要求伺服端下載資料
  • 取得、設定 cookie,依使用者決定呈現的data
  • local (client) storage

同時JS也必須因為安全考量限制其功能
比如:

  • 不得操作OS等核心
  • 除非使用者同意,不得使用硬體設備
  • Same origin policy (同源政策) 限制不同web間正常來說要獨立 (資安保護)
  • 只能從一個server接收資料 (否則須權限)

基礎語法

1.Console,a keyword,refer to a object
keyword:能被程式辨認且有特殊意義的字
object:資料與行為的集合
*console.log 不會顯示給user
*alert() 、comfirm(…)、prompt()則會跳出視窗顯示訊息

console.log(5); 印出5 ;做斷句
console.log(‘this is a book’); 印出string

2.註解方式:just like C++
(//、//)

3.Data Type:
primitive data

  1. 數字 (include 整數、小數、Infinity、NaN)
  2. 字串(‘’ or “”)
  3. 布林值
  4. NULL : null,代表無值
  5. undefined :類似null
  6. Symbol (variable)
    complex data
  7. object (data & action)

*Note: Data type convertion
由於JS是動態弱型語言,有很多隱轉,比如
字串串接 (A+B = AB)
數學加法 (“6”/“3” =2)
….
*如果數字轉型失敗會出現NaN

4.基本運算元 與其他語言差不多,有加減乘除,取餘數

5.字串串接: ‘A’ + ‘B’= ‘AB’

6.性質:
所有data都是data type的實例(instance),因此都擁有Data type的property 例如所有字串都有length的性質 ‘hello’.length 就是5

7.method:
類似性質,data type可使用的函式
console.log()的log()就是如此

8.內建object
善用此網站查詢所要涵式
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
比如使用Math物件中的random()

應用:隨機取0-50

注意: 使用方式

coding skill in JS
(1)建議加 ;
(2)最好採用先主code 後 help function 的方式 (讓人不一定需要讀function code)
(3)好的funciton、variable 名字可以代替註解
(4)善用continue、return 避免過多層的nest
(5)comment只用在重要解法、high level view 、function 用法

B.JS變數:
(a)概述 (程式語言的複習)
變數是儲存資料於記憶體中
變數三操作:創造、儲值、取值
變數=/=數值 :變數只是代表一個值 (box and things)
變數優點:易讀、少錯

(b)Create variables:
recall:JS 是直譯、動態(runtime才檢查)、弱型別(隱轉)語言
var、let、const來創造變數
1.var例子:(ES6以前的版本)

//變數採 camel casing 命名法(thisIsAnApple)
2.let 例子:
用法跟var一樣

  • 注意:若只宣告變數而不初始化,JS會視為undefine型態

3.const例子: 同C++中的常數,不可以改值,初始化未賦值視為錯誤!

(c)變數運算
1.和C++類似有+=.. ++…等等操作
2.變數也能字串串接
3.字串插值(重要)
template literals: 用``(反斜線刮住的字串)
可以使用${變數}來代值 (類似於bash 或 python的.format)
eg:

優點:易讀
4. typeof variable :回傳variable 型態
eg:

let my = 65  
typeof my      //retrun number

C.條件判斷
(a)跟C++類似 (if-else if -else)

(b)比較運算子

  • note: 字串採用字典比較
  • note: null、undefined(NaN)在大小於比較一定會return false,故應特例處理

(c)邏輯運算子

(d)資料型態真假值
以下恆假

除此之外都為真

*補充:優雅程式寫法: (類似於bash)

D.函式
函式本質是一段可重複利用的程式碼
(a)宣告

  • 注意function 關鍵字

  • 如沒有return值,會return undefine

  • Hoisting (提升) JS可以允許先使用再定義函式!

使用上幾乎與C++概念相同,唯一需要注意的是在JS,function也可以作為參數

(b) anonymous function 與 arrow function
本質上是一種語法糖,可以簡化寫法
anonymous funciton

以上例子中可以看到兩個無名的funciton被作為函式傳入
並且分別代表no()與yes()

arrow function

甚至function關鍵字也可以省略

E Scope:
基本同C++
global:不在任何一個block內,整個檔案都能使用此區域的變數
block:在某一對 {} 中,裡面宣告的變數只有此block能使用,使用未宣告的變數會有ReferenceError (而非undefine!)
Scope pollution:過多變數在全域,可能會引發未定義行為(unexpected behavior)

  • Scope規則的好處:安全、易讀、好維護、省記憶體

F.array & loop:

array

(a).Create
array可以用
let myArray=[‘string’,100,true]去創造,同時因為JS是weak type,array可存任意物件! 當然array也可以存在array中 (just like python)

  • note: 可想像array就是一堆變數

  • note: array名代表整個array!(不是位址)
    (b).access element
    myarray[n],第n+1個element (從0開始)

  • note: 字串一樣可以用此方式取字元

  • note: 取用超出arrray bound 是 undefine,而不是error
    當然也能update元素

  • 注意:用const宣告的array還是能修改array element,但不行重新assign該array eg:
    const myArray=[1,2,3]
    myArray[0]=2 //OK
    myArray=2 //invalid!
    (但是myArray是用let就沒問題,記住JS是weak type)

(c)array 操作
length 可以看有多少元素 (remember ‘string’.length)
*小技巧: A[A.length-1] 就能取到最後一個元素
push() 可以在array最後面放入元素
pop()可以取出最後面的元素 (刪除兼回傳)
更多可參考
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
比如:
shift() 刪除第一個元素
unshift() 在array前面放入元素
slice() 類似於python的[:],可以取段落出來

Loop

(a)for 與C++同 提醒可以使用 \for(let i=0;i<\myArray.length;i++) 去traversal所有元素in myArray (b)while 與C++ 同,也有do…while

G.High Order function & iterator
由於較為繁瑣,請參考原筆記 點此

H.Object (JSON 相關)
Object會收集相關Data與function,就像字典一樣,也因為其方便與可讀性,成為一種廣泛使用的交換資料格式
(a)建立javascript object
let variable ={}
object是用key-value pair的形式製造

  • 注意,key一定是字串,但JS允許omit(省略) 引號‘ ‘
  • 注意,鍵值中間是用 : 隔開(同python 字典)
  • 注意,分隔是使用逗號,而且結束不用加分號
  • 注意,鍵就像變數名,而值一樣可以是任意型態(even 陣列、函式)
    (b)取用

(c)修改object property
類似於python
可以用obj[key] = value進行修改
*注意:如果property原本不存在object中,則會創造新的property
*注意:可以使用delete 去刪除property
例如 delete spaceship.color;
其他進階主題也可以參考原筆記
點此

參考資料

https://www.codecademy.com/learn/introduction-to-javascript