6. JavaScript 型別 - ZoeHYH/mentor-program-4th GitHub Wiki

屬性 Property 與 方法 Method

只有物件型別有屬性與方法,原始型別在調用屬性與方法時,會自動轉換成 Primitive Wrapper Objects ,存取完再自動刪除。

弱型別語言

宣告變數時不需要宣告型別,但執行跨型別的運算時會自動轉換型別

console.log(數字+字串) //字串

原始型別 Primitive Type

console.log(Object.prototype.toString.call(變數)) //更準確的變數型別
console.log(typeof true) // boolean
console.log(typeof null) // object ,發明時就這麼設計
//空值的物件?等同 0 、 "" ?
console.log(typeof undefined) // undefined
console.log(typeof Symbol()) // symbol

不可改變 Immutable

var a = 1, b = a
b++
console.log(a) // 1

數字 Number

console.log(typeof 30) // number
數字+='' //字串
  • 浮點數誤差:電腦無法精準儲存小數。

    var a = 0.2 + 0.1
    console.log(a) // 0.30000000000000004
    console.log(a == 0.3) // false
    
  • 數字相關的內建函式

    Number(字串) //轉換成數字
    parseInt(字串[, 進位方式 Radix]) //忽略小數,最大三十六進位,默認十進位
    parseFloat(字串)
    //字元無法轉換就回傳已轉換的值,第一個字元無法轉換回傳 NaN
    
  • 方法

    數字.toFixed([到小數點前幾位]) //四捨五入,傳回字串
    數字.toString([進位方式 Radix])
    
  • 屬性

    數字.MAX_VALUE //能儲存的最大數值超過回傳 Infinity
    
  • 內建物件 Math 的方法

    Math.ceil(數字) //無條件進位成整數
    Math.floor(數字) //無條件捨去成整數
    Math.round(數字) //四捨五入成整數
    Math.sqrt(數字) //開根號
    Math.pow(基數 base , 指數 exponent) //次方結果
    Math.random() //產生 0~1 的隨機小數,實務上會乘一個數字再無條件捨去
    
  • 內建物件 Math 的屬性

    Math.PI //圓周率
    

字串

console.log(typeof 'hello') // string
'J' >= 'A' && 'J' <= 'Z' // true ,可以判斷大小寫
字串[序號] //可以用 [] 存取
  • 方法

    字串.indexOf('尋找字串') //回傳字串起始序號,從 0 起算,不存在回傳 -1
    字串.replace('尋找字串','取代字串') //可結合正規表示法尋找
    字串.split('字串') //字串陣列中不會有作為分隔符號的字串
    字串.trim() //取代空格
    字串.toUpperCase() //大寫
    字串.toLowerCase() //小寫
    字串.charCodeAt(第幾字元) //從 0 起算,轉 ASCII 編碼
    
  • 字串相關的內建函式

    String.fromCharCode(編碼) //編碼轉
    
  • 屬性

    字串.length
    
  • 跳脫字元:讓電腦視特殊符號為純字串

    \ //跳脫字元
    console.log("\"") // "
    
  • 控制字元

    \n // newline ,另起一行
    \r // carriage return ,回到開頭輸入
    \t // Tab
    \b // word boundary ,退一格輸入
    \f // form feed ,新一頁
    

物件型別 Non-Primitive Type

可改變 Mutable

記憶體內容可改變。

console.log([] === []) // false ,記憶體位置不同
console.log({} === {}) // false ,記憶體位置不同
var a = [], b = a
b.push(1)
console.log(a) // 1

物件 Object - 陣列 Array

許多個有序號的同性質資料箱子,大部分語言的序號從 0 開始。

console.log(typeof [1]) // object ,即陣列 Array
var 陣列名稱 = [值, 值, 值]
console.log(陣列[序號]) //取出值的方法
var 陣列 = [] 
for (var i=0; i<n; i++) {  //建立 n*n 二維陣列
	陣列[i] = []
	for (var j=0; j<n; j++) {
		陣列[i].push(j)
	}
}
  • 方法-傳出新陣列,可以結合使用

    陣列.join([值]) //用值或默認的 , 連接合併字串
    陣列.map(函式或函式表達式) //運算完成元素的新陣列
    陣列.filter(函式或函式表達式) //只含結果為 true 元素的新陣列
    陣列.slice(序號, 序號) //從開始到結尾序號前元素的新陣列
    陣列.splice(序號, 刪除幾個元素, 插入元素) //修改原陣列
    
  • 方法-傳出值

    陣列.indexof(值,[起始索引值]) //回傳找到的索引或 -1 ,索引值 -1 代表最後一個,但不影響尋找順序
    
  • 方法-原地改變原陣列

    陣列.push(值) //把值放到最後面,並回傳新長度
    陣列.unshift(值) //把值加到最前面,並回傳新長度
    陣列.pop() //去除並回傳最後一個元素
    陣列.shift() //去除並回傳第一個元素
    陣列.reverse() //反轉陣列
    陣列.sort([函式]) //原地排序(無輔助變數),默認根據 Unicode 編碼位置值排序
    //函式回傳 0 不變, >0 則 b,a , <0 則 a,b
    陣列.sort((a, b) => a-b) //讓數字依大小升冪排序
    陣列.sort((a, b) => b-a) //讓數字依大小降冪排序
    陣列.sort((a, b) => a.key-b.key) //取字典的數字資料值排序
    陣列.sort((a, b) => a.toUpperCase() < b.toUpperCase() ? -1 
    : a.toUpperCase() > b.toUpperCase() ? 1 
    : 0) //字串忽略大小寫排序
    陣列.sort((a, b) => a.key.toUpperCase() < b.key.toUpperCase() ? -1 
    : a.key.toUpperCase() > b.key.toUpperCase() ? 1 
    : 0) //取字典的字串資料值忽略大小寫排序
    

物件 Object

儲存多種資料。

console.log(typeof {a: 1}) // object ,就像字典
var 物件名稱 = {
	key: value, // value ,也就是值,可以是各種型別
	key: value
}
console.log(物件.key) //點記法 Dot notation 取值
console.log(物件["key"]) //括弧記法 Bracket notation 取值,因此物件也叫相聯陣列 Assciative array
  • 方法
物件.hasOwnProperty(值) //物件中存在此元素就回傳布林值
  • 函式

函式 Function

可重複使用的程式碼區塊。

console.log(typeof function) // function

調用 Invole

  • 引數 Argument:每一次調用時傳遞值給參數的變數,不是傳址。

    函式(函式(引數)) //函式本身也可以做為引數傳遞
    

函式宣告 Function Declation

  • 參數 Parameter:宣告時的變數,不可命名為arguments,切勿在函式內變更、重新賦值。

  • 物件arguments函式範疇類陣列的物件 Array-Like Objects ,儲存所有賦給Peremeter的值,以陣列方式存取值,不具length以外的陣列屬性方法,箭頭函式沒有這個物件。

  • return:視需求使用

    return 變數 //為 statement ,會跳出 function
    return Expression
    return { // 要在同行,否則電腦會自動中斷
    	物件
    }
    return // 或沒有 return 也會 undefined
    
  • 函式陳述句 Function Statement

    函式(引數) //提升 Hoisting
    function 函式名稱(參數) { //用來傳遞值的變數
    	Statement
    }
    
  • 函式表達式 Function Expression

    • 把函式賦值給某個變數

      函式(引數) //宣告時用 const 或 let 就不會被提升
      var 函式名稱 = function (參數) { //可以省略
      	Statement
      }
      
    • 放在要使用的地方

      function 傳遞引數的函式{}
      console.log(
      	傳遞引數的函式(引數 ,function (參數){
      		Statement
      	})
      )
      
    • 匿名函式 Anonymous Function:直接執行就不用命名

  • 箭頭函式 Arrow Function Expression

    (參數, 參數) => { //參數只有一個時可以省略 ()
    	Statement
    	return Expression 
    }
    參數 => Expression //省略 {} 時可省略 return
    () => {} //沒有參數,不回傳值