Javascript
運算子
短路性質
可變與不可變
基礎語法
console.log(‘hello world’);
node
,下一列會出現大於符號。^C
,或者是輸入 .exit
即可離開跳出。===
!==
&&
||
!
範例:
<<
:將位元往左移一位,可將其看成乘以 2 的幾次方。舉例來說:10 << 2 = 10 * 2^2 = 40、3 << 4 = 3 * 2^4 = 48。>>
:將位元往右移一位,可將其看成除以 2 的幾次方。若不能整除會直接捨去。舉例來說:1024 >> 2 = 1024 / 2^2 = 256、57 >> 4 = 57 / 2^4 = 3 (直接捨去)&
(and):
4. |
(or):
5. ^
(xor)(發音 exclusive or):
6. ~
(not):
因為它會看成 console.log ( a && 30 ),這列執行完,再看 a++。
++a 則是正常執行。
因為此時就是單純執行 console.log( ++a && 30 )。
以上的兩行程式碼當中的記憶體位置會如下圖所示。
第一行像是我將 { a:1 } 存在某個記憶體位置(0x01),而 obj 內存放在這個記憶體位置(0x01)。
而第二行 obj2 變數不會再新增一個記憶體,他會直接導向 obj 的記憶體位置(0x01)。
那如果我更改 obj.a 這個物件呢?
以上的程式碼當中的記憶體位置會如下圖所示。
我們在第三行更改了 obj2.a 的值,按照剛剛的邏輯,他會更改記憶體位置(0x01)的內容,所以這時結果仍然是 true。
那如果我們另外新增一個物件,而非更改既有的呢?
以上程式碼的記憶體位置如下圖。
此時就無法再更改記憶體位置(0x01)的內容了,因為這邊新增的是 {b:1},但在 0x01 裡面並沒有 b。所以這時後 obj2 就會另開一個記憶體位置(0x05),並在此放入 {b:1}。因此,結果才會是 false。
直接透過範例更了解可變與不可變的觀念。
若要更改字串需重新賦值,如下。
那如果我這時候將改變後的陣列另存記憶體呢?
為什麼這邊印出來的是 3 呢?
因為
.push()
這個函式的回傳值是最新的陣列長度
所以當這時候我將這個函式的結果存到 fruit 裡的時候,就會將回傳值存進去,而這裡的回傳值是 3。
除此之外,要特別注意的是,某些陣列函式回傳值不是陣列,這時候就會需要另存記憶體。
結構如下:
範例:
將 IF … ELSE… 條件句縮寫
縮寫結構:條件式 ? 對的話做這件事 : 不對的話做這件事;
以上是普通條件句寫法,以下使用三元運算子。
除了一般的 if
、 else if
、else
外,也可以使用 Switch Case 來執行條件句。
存取性質相近(都是數字或是字串)、重複性高(可能有十幾個物件)。
.length
計算陣列的物件數.length - 1
取得最後一個物件值.push()
在陣列末端加入值.join('')
將陣列中的元素結合變成字串.map(欲使用的函式)
將陣列套入函式除此之外,.map()
可以累加使用,也可以使用匿名函式的方式。
.some(欲使用的函式)
:一樣也是將陣列套入函式不一樣的地方是會回傳 boolean 值。如果是空陣列的話,會回傳 false。
.filter(欲使用的函式)
將陣列套入函式不同於
.map()
的地方在於:return 值可套用邏輯,回傳為 true 才會留下,false 會捨去。
一開始先透過.map()
套入 function,將元素全部乘以三後,再透過.filter()
,過濾這些結果是否 >= 0。如果是的話,就會被回傳。所以這邊得到的是 [ 3, 9, 15, 0 ],-6 跟 -12 被捨棄了。
.slice(開始的索引值, 結束的索引值)
取得陣列中的某段元素,開始的索引值會被包含、結束的不被包含。如果不寫結束的索引值,會預設 -1,也就是直接取到最後一個。
開始的索引值 1 是 3,結束的索引值 4 是 -2,不過結束的索引值 -2 不包含。所以得 [3, 5, 0]。
.splice(開始刪除的索引值, 刪除幾個物件, 加入的物件)
陣列的刪除、插入或更改元素單純刪掉物件,則不需要填入第三個參數(加入的物件)
如果再刪除幾個物件裡面填 0,就會是插入的功能。填 1 以上就會是更改的功能。
如上,從索引值 1 (3)開始刪除,但是因為第二個填入的是 0,所以不刪除,變成在 3 之前插入了 2。所以得 [-1, 2, 3, 5, 7]。
如上,從索引值 1 (‘Jul‘)開始刪除,第二個填的是 2,所以刪除了 ‘Jul‘ 跟 ‘Dec‘,再加入 ’Feb‘ 跟 ‘Mar‘。所以得出的結果是 ['Jan', 'Feb', 'Mar', 'Apr', 'May']。
.sort()
按照字母(a-z)或是數字(1-9)進行排序按照開頭字母的順序及數字開頭的順序,並非按照數字大小
如果希望陣列按照數字大小排序,由小排到大,可參考以下做法。
如果想要由大排到小,只需要將 b > a 改成 a > b 即可,其他不變。
forEach()
將陣列內的每個元素,個個帶入函式中一次。如果想要將陣列一個個印出、或是一個個套入函式中,不需要再寫迴圈,直接用
forEach()
即可。
Array 名稱.indexOf('')
找出該 array 中某東西的索引值。在大括號{}內存放各種不同性質的物件。特性為資料存取方式容易,常透過.
來連接欲存取資料。
也可透過中括號 [ ] 存取資料,但較不常見。
直接透過 Peter.Address = 'Taipei city';
新增物件的 Address 內容。
delete
刪除物件內容do while 迴圈有兩種用法。先假設我們想要印出 1 到 5。
第一種用法:
第二種用法:
break
: 中斷,並跳出該 loop。continue
:一般來說如果迴圈搭配條件式使用,如果找到要找的值,就會停止繼續找剩下的了。continue
的用意就是即便找到了,繼續將剩餘的找完 (執行到 continue
的話,會跳過 continue
的下一行指令(依照以下範例的話是跳過 console.log('不是第' + i + '個,第' + i + '個是' + arr[i])
),切換到 while
繼續執行)。continue 範例:找出陣列中的值的索引值
目標:印出 1-5。
簡單來說就是將剛剛的 do while 迴圈的 do 刪掉,將 while 的條件移到前面,其他不變。
目標:印出 1-5。
另一種 for 迴圈寫法,稱為 for...of
。
函式就有點像數學中的 f(x),所以這邊先以數學的 f(x) 為例。
以下是程式中的函式。
function 為函式。函式名稱:abc。參數:a, b, c。
兩個範例只差在最後的兩行。
上面的將 add function 直接放入
console.log()
裡,下面的先執行 add function 後,再印出 a。
這樣的小差別,卻可以讓兩個的答案完全不同。
目標:建構一個輸入 10 就會回傳 [1, 2, 3, 4,..10] 的陣列函式。
陣列型式也可與 function 內可結合 function 的功能結合,如下:
我們先來看一般宣告函式的方法。
如標題,先宣告一個變數,再將此變數賦值給一個函式。
顧名思義,匿名函式就是沒有名字的函式。會直接將名字省略,所以通常在使用此函式時不需要先寫一個函式、應用時套用參數,欲使用時直接將整個函式寫出來即可。
什麼是參數跟引數呢?看個範例就知道了。
參數是範例中的 a 跟 b。引數是實際案例中的 c (10)跟 d(20)。
引數(argument)跟 array 很像,是個類陣列 (array-like) 的物件,可被放入 function 內。
依照上面的這個範例,我們可以看出來 arguments 確實是個類陣列的物件。因此我們可以透過這個特性,去做相關利用。
Number()
將字串轉換為數值.toString()
將數值轉換成字串parseInt(參數,幾進位的參數)
將字串轉換成整數若沒寫第二個參數預設十進位
parseFloat(參數)
將字串轉換為小數.toFixed(到小數第幾位)
將小數點捨去到指定的位數剩餘的小數點會自動四捨五入
若是不填參數預設全部捨去
Number.MAX_VALUE
列出記憶體可儲存的最大數值Number.MIN_VALUE
列出記憶體可儲存的最小數值Math.PI
印出常數 πPI 是常數(constant),固定不會變的值,通常以大寫表示
Math.ceil()
小數點無條件進位成整數Math.floor()
小數點無條件捨去成整數Math.round()
小數點四捨五入成整數Math.sqrt()
開根號Math.max(可放多個參數)
取最大值Math.min(可放多個參數)
取最小值Math.pow(參數, 的幾次方)
取參數的幾次方Math.random()
隨機取得 0 到小於 1 之間的數(也就是 0 - 0.999…)那如果我們想要用此語法製作出隨機選出 1 - 10 的數呢? 或許我們可以套用之前學的無條件捨去 ─ Math.floor()
。
透過此語法也可以自己定義出隨機選值的範圍。
.toUpperCase()
全數轉成大寫.toLowerCase()
全數轉成小寫charCodeAt(字串索引)
可得字母的數字值String.fromCharCode()
從數值轉換成字母charCode 字母大寫跟小寫都會差 32,小寫比大寫大,像剛剛 B 是 66,小寫 B = 66 + 32 = 98。可以利用這個固定差取得大寫字母或小寫字母。
.indexOf(要找的東西)
得出要找的東西的索引。那如果沒找到呢? 會回傳 -1。
這個特性可以搭配條件式使用,如果 >= 0 等於存在,如果 <0 等於不存在。
.replace(被取代的字串, 新的欲放入的字串)
取代字串只會取代一次
那該如何取代多個呢?/ 被取代的字串/g
(global)
.trim()
將前後空格去掉.split(以此切開的字串)
將字串切開並放入陣列◎ 讀取 csv 格式時,很常是以逗號分割,如 data1, data2, data3 等等,這時就可以使用。若前後有空格,可搭配.trim()
使用
.length
得總共有幾個字(包含空格或符號)碰到 bug 的時候可以透過瀏覽器的 debugger 一行行的將程式碼跑過,透過視覺化的方式了解跑程式的過程。
必須在 Chrome 中使用。可先在 cmder 建立一個 html 檔案,並透過 vim 編輯後從 Chrome 打開。以下提供範例內容。
在 Chrome 中打開 dev tools 後點開 Sources 標籤,重新整理就會看到游標跑在 debugger 上。以下為圖示。