-
Notifications
You must be signed in to change notification settings - Fork 0
markdown3.md
陣列操作 JavaScript 的陣列宣告非常簡單,就是用 [ ... ] 所框起來的一連串資料。以下我們啟動 node之後用交談的方式先進行一些陣列操作的示範,以便讓讀者能實際體會《陣列到底是甚麼?》
陣列存取 $ node
a=[0,1,2] [ 0, 1, 2 ] a [ 0, 1, 2 ] a[0] 0 a[1] 1 a[2] 2 a[3] undefined a[4] undefined a[9] undefined a[9]=9 9 a [ 0, 1, 2, , , , , , , 9 ] a[0]=7 7 a [ 7, 1, 2, , , , , , , 9 ]
函數操作 在 javascript 當中,陣列是一種《物件》,裡面有很多可以呼叫的函數,像是 push, pop, shift, unshift, join, reverse, slice, sort .... 等等,我們可以透過這些函數對陣列進行操作,取得我們所想要的結果。以下是一系列的互動示範。
a = [1,2,3] [ 1, 2, 3 ] a.push(4) // 把 4 推入陣列尾端 4 a [ 1, 2, 3, 4 ] a.push(5) // 再把 5 推入 5 a [ 1, 2, 3, 4, 5 ] a.concat([6,7,8]) // 將兩陣列連接起來後傳回,但必須注意這並不會改變 a 的內容。 [ 1, 2, 3, 4, 5, 6, 7, 8 ] a // a 的內容並沒有改變 [ 1, 2, 3, 4, 5 ] b=a.concat([6,7,8]) // 如果想把連接的結果記住,可以塞給某變數,例如 b 。 [ 1, 2, 3, 4, 5, 6, 7, 8 ] b [ 1, 2, 3, 4, 5, 6, 7, 8 ] a [ 1, 2, 3, 4, 5 ] a.join(':') // 把陣列用 : 符號連接成一個字串。 '1:2:3:4:5' a.join() // 把陣列連接成一個字串 (預設連接符號為 ,) '1,2,3,4,5' a.pop // 陣列.pop 是一個函數 [Function: pop] a.pop() // 呼叫該函數可以《彈出》最後的那個元素! 5 a // 《彈出後》該陣列尾端的元素就移除了! [ 1, 2, 3, 4 ] a.reverse() // 將陣列反轉! [ 4, 3, 2, 1 ] a // reverse 之後陣列就真的反轉了,原本的 a 被修改成反轉後的狀態! [ 4, 3, 2, 1 ] a.shift() // 從陣列頭部取出一個元素。 4 a // shift 之後,頭部的元素就真的移除了! [ 3, 2, 1 ] b // 上次用 a.concat([6,7,8]) 所做出來的 b 元素還在。 [ 1, 2, 3, 4, 5, 6, 7, 8 ] b.slice(2,4) // 用 slice 取出其中第 2 個到第 4 個之間的子陣列。 (注意:這只會傳回 b[2], b[3], 不包含 b[4]) [ 3, 4 ] b.slice(2,6) // 取出其中第 2 個到第 6 個之間的子陣列。 [ 3, 4, 5, 6 ] a // 再次看看 a 的內容 [ 3, 2, 1 ] a.sort() // 將 a 排序 (預設為由小到大排列) [ 1, 2, 3 ] a // a 的內容被從小到大排列了! [ 1, 2, 3 ] b [ 1, 2, 3, 4, 5, 6, 7, 8 ] r=b.splice(1,3, "a", "b", "c", "d") // splice 的功能有點複雜,是將指定的 (1,3) 區間移除後,再插入後面的那些元素。 [ 2, 3, 4 ] r // 所以 (1,3) 區間內的 (2,3,4) 被移除了。 [ 2, 3, 4 ] b // 然後又塞入了 "a", "b", "c", "d" 這四個元素! [ 1, 'a', 'b', 'c', 'd', 5, 6, 7, 8 ]
當您會使用互動式的方式操作陣列之後,就可以開始撰寫有關陣列的程式了。
一維陣列 JavaScript 的陣列宣告非常簡單,就是用 [...] 所框起來的一連串資料,或者您也可以用 new Array() 語句來建立一個空的陣列,而且可以用 length 屬性來取得陣列大小。
檔案:array.js
var a=[1,6,2,5,3,6,1];
for (i=0;i<a.length;i++) { console.log("a[%d]=%d", i, a[i]); } 執行結果
D:\jsbook>node array.js a[0]=1 a[1]=6 a[2]=2 a[3]=5 a[4]=3 a[5]=6 a[6]=1 當然、javascript 有些語法是 C 語言所沒有的,像是 JavaScript 的 foreach 語句採用 for (i in c) 這樣的語法,其中的 c 必須是個陣列或容器,而 i 則是索引值 (注意、不是內容,是索引值),以下是這種語句的一個範例。
檔案:foreach.js
var a=[1,6,2,5,3,6,1];
for (i in a) { console.log("a[%d]=%d", i, a[i]); } 執行結果
D:\jsbook>node foreach a[0]=1 a[1]=6 a[2]=2 a[3]=5 a[4]=3 a[5]=6 a[6]=1 另外還有 for of 語法
檔案:forof.js
var a=[1,6,2,5,3,6,1];
for (o of a) { console.log("o=%s", o); } 執行結果
$ node forof.js o=1 o=6 o=2 o=5 o=3 o=6 o=1 二維陣列 除了一維陣列、我們也可以宣告二維、三維、甚至更高維的陣列,以下是一個將二為陣列格式化為字串後印出來的範例。
檔案:array2D.js
var a=[[1,6,2], [5,3,6]];
for (var i=0; i<a.length; i++) { var line = ""; for (var j=0; j<a[i].length; j++) { line = line + a[i][j] + " "; } console.log(line); } 執行結果
D:\jsbook>node array2D 1 6 2 5 3 6 結語 雖然陣列和字串都可以用 a[i] 這種方式存取裡面的元素,但是兩者所具有的函數還是不一樣的。
在 javascript 裡面,字串並非一種陣列,因此我們可以對陣列進行 push 等動作,但是卻不能對字串進行 push 動作,否則會發生錯誤的!
以下是一個誤用的範例:
D:\cccwd2\file\jsh\code>node
"abc".push("d") TypeError: "abc".push is not a function at repl:1:7 at REPLServer.defaultEval (repl.js:248:27) at bound (domain.js:280:14) at REPLServer.runBound [as eval] (domain.js:293:12) at REPLServer. (repl.js:412:12) at emitOne (events.js:82:20) at REPLServer.emit (events.js:169:7) at REPLServer.Interface._onLine (readline.js:210:10) at REPLServer.Interface._line (readline.js:549:8) at REPLServer.Interface._ttyWrite (readline.js:826:14) ["a", "b", "c"].push("d") 4
所以在使用 javascript 裡面,記得不要把字串誤以為是陣列來用喔!