Node.js 環境建置
- 
node.js - 不是程式語言,而是一個執行環境,能讓 JavaScript運行於瀏覽器外。
- 安裝:官網。LTS是較穩定的版本,Current是有其他新的功能。
 
- 不是程式語言,而是一個執行環境,能讓 
透過 iTerm 建立 js 檔案,並用 node 執行寫好的程式。
1. 建立 JavaScript:vim index.js
// index.js 
console.log(123)
2. 用 node 執行寫好的程式碼
$ node index.js
=> 123
直接用 node 執行 JavaScript
1. 執行
$ node
=> 等同於進入瀏覽器的 console tab
2. 離開
快速鍵 control + c (輸入兩次) 或是輸入指令:
$ .exit
邏輯運算
邏輯運算子 ||(或)、&&(和)、!(not)
|| 短路性質:
3 || 10
// => 3
// 程式遇到 3 時,因為是 truthy value,所以直接回傳 3,後面就直接不執行了。
true || 10
// => true
// 程式遇到 true 時,true 符合條件造成短路,後面就直接不執行了。
false || 10
// => 10
// 程式遇到 false 不符合條件,往後繼續執行,遇到 10 達成條件!回傳 10。
&& 短路性質:
3 && 10
// => 10
// 第一個值符合條件,檢查第二個值是否符合條件,回傳第二個值 10。
false && 10
// => false
// 因為第一個值已經是 false,後面短路不執行,回傳 false。
0 && 10
// => 0
// 因為第一個值是 falsy value,後面短路不執行,回傳第一個值 0。
位元運算
位移運算子 <<、>>
了解電腦都是使用二進位做運算
- 100=> 2 的三次方 =>- 8
- 1000=> 2 的四次方 =>- 16- 往左移 1 位,是乘以 2 倍
- 往左移 2 位,是乘以 2的2次方(4)
- 往右移 1 位,是除以 2 倍
- 往右移 2 位,是除以 2的2次方(4)
 
10 << 1
// 20 => 往左移一位,乘以2的1次方,= 10 * 2
10 << 3 
// 80 => 往左移三位,乘以2的3次方,= 10 * 8
1024 >> 1 
// 512 => 往右移一位,除以2的1次方,= 1024 / 2
9 >> 1
// 4 => 往右移一位,除以2的1次方,= 9 / 2,無條件捨去。
10 >> 1 會比 10*2 執行效能還要好。
位元運算子 &、|、xor、not
都會換算成二進位來運算
& and 位元運算子:
10 & 15
// 10 => 1010 and 1111 = 1010(2) = 10(10)
| or 位元運算子:
10 & 15
// 15 => 1010 or 1111 = 1111(2) = 15(10)
xor 位元運算子:當一個 falsy value 和 truthy value 共存時回傳 true,其他都是回傳 false。
10 ^ 15
// 5 => 1010 xor 1111 = 101(2) = 5(10)
not:1變0,0變1
~15
// -16 => 1111 = 0000 (因電腦位元關係,原本的1111前有眾多的0,經過not運算會全轉為眾多的1)
tips: 判斷數值是奇數或偶數
10 & 1
// 0 => 判斷最後一個字是零的話,代表是偶數。
11 & 1
// 1 => 判斷最後一個字是一的話,代表是奇數。
變數
類型
- Primitive type and Object type
- Primitive:
- string, boolean, number, null, undefined, symbol(ES6)
 
- Object:
- object (array, function, object)
 
 
- Primitive:
- undefined: 已宣告,尚未值
- not defined: 連宣告都沒啊!
變數的運算注意的事情
- 變數是什麼類型!
- 浮點數的誤差
複習一下等號的意義
- 一個等號 =,賦值。
- 兩個等號 ==,判斷值。
- 三個等號 ===,判斷類型與值。
let a = 10 == 10
console.log(a)
// true,通常先執行右邊的程式 10 == 10,再把判斷結果賦值給 a。
物件與陣列的判斷
console.log([] === []) // false
console.log([1] === [1]) // false
console.log({} === {}) // false
console.log({a: 1} === {a: 2}) //false
// 物件的判斷是根據記憶體位置。
// 可以想像我有一台蘋果電腦,你也有一台蘋果電腦,但你的電腦不是我的電腦的概念。
我們只能往不同地方走去:判斷式
if… else…
if… else if… else…
switch
let number = 11
if (!(number % 5)) {
  // 了解:如果餘數是 0,代表可以被 5 整除
  // 但 0 == false,利用 not 特性將結果變成 true 以進入判定 block
  // (可讀性差)
  console.log('5的倍數')
} else {
  console.log('不是5的倍數')
}
ternary 三元運算子
(a > b) ? 'big' : 'small'
迴圈/函式
實現輸入的數值會回傳一個區間陣列
function generateArray (min, max) {
  var result = []
  for(var i = min; i <= max; i++) {
      result.push(i)
  }
  return result
}
console.log(generateArray(5, 10)) // [5, 6, 7, 8, 9, 10]
- tip: 實作的時候,如果細節尚不清楚,可以試著先把function列出來,整理出邏輯(流程)
把 function 當成引數傳入
function transform(arr, transformFunction) {
  var result = []
  for (var i = 0; i < arr.length; i++) {
    result.push(transformFunction(arr[i])) // 執行傳入的 function
  }
  return result
}
function double (num) {
  return num * 2
}
transform([2, 4, 6], double) // 把 function 當成引數傳入
參數(Parameter)與引數(Argument)
- 參數:定義在 function中()的變數。
- 引數:呼叫某函式時的 ()的變數。
funtcion myFunc(a, b) { // a, b => 參數
  console.log(arguments.length) // 引數的數量
  console.log(arguments[0]) // 第一個引數
  return arguments // {a: 1, b: 2} => 回傳引數類陣列物件
}
myFunc(1, 2) // 1, 2 => 引數
arguments 跟你想的不一樣
- arguments物件是一個對應傳入函式之引數的類陣列(- Array-like)物件。(參考:MDN)
function 使用注意事項
- pass by value
- pass by sharing
https://blog.techbridge.cc/2018/06/23/javascript-call-by-value-or-reference/
return 不 return,有差嗎?
- 差別只在於需不需要結果的。需要結果就回傳。
Number 類型的內建函式
常用的函式
- 字串轉數字 - 整數
// 沒填進位制的話預設是 10 進位,可接受 2~36
function roughScale(x, base) {
  var parsed = Number.parseInt(x, base);
  if (Number.isNaN(parsed)) {
    return 0;
  }
  return parsed * 100;
}
console.log(roughScale(' 0xF', 16));
// expected output: 1500
console.log(roughScale('321', 2));
// expected output: 0
parseInt('50個') // 50
parseInt('50個', 10) // 50
parseInt('50.2個', 10) // 50
- 字串轉數字 - 浮點數
parseFloat('20.5') // 20.5
- 數字轉字串
let num = 1
num.toString()
- 四捨五入
function calculator (x) {
    return Math.round(x)
}
calculator(20.5456789) // 21小數點第一位四捨五入後回傳整數
- 無條件進位
function calculator (x) {
    return Math.ceil(x)
}
calculator(20.3456789) // 20,小數點第一位無條件進位後回傳整數
- 無條件捨去
function calculator (x) {
    return Math.floor(x)
}
calculator(20.3456789) // 20,小數點第一位無條件捨去後回傳整數
- 小數點後取幾位數(並四捨五入)
function calculator (x) {
    return x.toFixed(2) // 如果都不傳,則直接回傳整數(四捨五入)
    // 接受 0~20
}
calculator(20.5456789) // 20.55
calculator(20.5416789) // 20.54
- 開根號
function calculator (x) {
    return Math.sqrt(x)
}
calculator(9) // 3
- 平方
function calculator (x, y) {
    return Math.pow(x, y)
}
calculator(2, 10) // 1024
- 最大值
let biggestNum = Number.MAX_VALUE
console.log(biggestNum) // 1.7976931348623157e+308
- 最小值
let smallestNum = Number.MIN_VALUE
console.log(smallestNum) // 5e-324
- 隨機亂數
// 產生 0~0.99999 隨機小數
Math.random()
// 產生 1~10 隨機數字
Math.floor(Math.random()*10 +1)
- 檢查是否是數字
Number.isNaN(NaN);        // true
Number.isNaN(Number.NaN); // true
Number.isNaN(0 / 0);      // true
// e.g. these would have been true with global isNaN()
Number.isNaN('NaN');      // false
Number.isNaN(undefined);  // false
Number.isNaN({});         // false
Number.isNaN('blabla');   // false
// These all return false
Number.isNaN(true);
Number.isNaN(null);
Number.isNaN(37);
Number.isNaN('37');
Number.isNaN('37.37');
Number.isNaN('');
Number.isNaN(' ');
String 類型的內建函式
- str.length:回傳字串的長度。
- toString():將物件轉字串。
- str.replace():。
- ' hello '.trim():回傳去除- ' hello '前後的空格,輸出- 'hello'這個字串。
- str.indexOf('b'):在- str找不找得到- b,沒有則回傳- -1,有則回傳第一個- b的起始位置,沒有則回傳- -1。
- str.lastIndexOf('b'):在- str找不找得到- b,沒有則回傳- -1,有則回傳最後一個- b的起始位置。
- str.charCodeAt(5):回傳- str找第六個字的- keycode。
- str.charAt(5):回傳- str找第六個字是哪一個字。
- str.split(' '):將- str這個字串以- str.slice(index1, b):切字串,但是以範圍來切後回傳,索引也可以從字串最後算起。
var str = 'The quick brown fox jumps over the lazy dog.';
console.log(str.slice(1));
// expected output: "the lazy dog."
console.log(str.slice(4, 19));
// expected output: "quick brown fox"
console.log(str.slice(-4));
// expected output: "dog."
console.log(str.slice(-9, -5));
// expected output: "lazy"
留言