今天的筆記內容比較雜一點。
陣列——任何東西的集合
要建立一個JS陣列可以這樣寫
var arr = new Array();
也可以使用陣列實體語法來建立
var arr = [];
此外,JS的陣列與物件很像,可以放各種資料,例如:布林值、物件和函數..等等。
例如:
var arr = [
24,
true,
{ name: 'Simon', isF2E: true},
function(name){
console.log(name + '挑戰鐵人賽第19天');
},
"hello"
];
陣列是從0開始數,如果要執行陣列序號3的函式,並帶入陣列序號2的物件屬性值,可以這樣寫:
arr[3](arr[2].name);
arguments與spread
先來看arguments
arguments與this一樣,當一個函式的執行環境被創造出來時,也會一併創造出arguments
這個關鍵字,它會保存所有傳進函式(當參數)的值。
function JusticeLeague(hero1, hero2, hero3){
console.log(hero1 + ',' + hero2 + ',' + hero3);
console.log(arguments);
}
JusticeLeague('Batman','Superman','Wonderwoman')
結果是
arguments雖然有[]
符號,但並不是真正的陣列,仔細看它也有點斜斜的,我們可以用typeof
來檢查它
function JusticeLeague(hero1, hero2, hero3){
console.log(typeof arguments);
}
JusticeLeague('Batman','Superman','Wonderwoman')
可以看到,它其實是一個物件。
spread運算子
(這節影片裡的說的spread operator
其實更像是rest operator
,不曉得有沒有人注意到。)
spread operator
展開運算子和rest operator
其餘運算子都是...
符號,並且是ES6以後才新增的內容,這兩者根據使用的狀況和情境有很大的差別。
可能是因為作者錄製影片時,...
運算子的規範還不齊全,所以影片快速帶過,這邊有興趣可以參考:
重載函式
其他程式語言如JAVA、C#有重載函式的特性,可以創建名稱一樣,功能卻略有差別的函式。JS並沒有這種特性,只能在函式裡寫判斷,並用複數函式互相呼叫,來達成類似的效果。
分號
JS會幫我們自動加上分號,更確切的說是語法解析器幫我們加上的。
大部分的程式語言需要在程式碼結尾加上;
分號,但是JS卻可以不用加,並不是說它不需要分號表示結束,而是語法解析器在轉譯我們寫的程式碼給電腦時,會自動幫我們在結尾加上;
分號。
只是自動加上分號的特性,偶爾會造成bug,例如:
function hero(){
return
{
Batman: 'Wayne'
}
}
console.log(hero());
如果語法解析器發現return
後面有鍵盤Enter換行,會以為開發者忘記加上分號而替我們補上,程式碼被翻譯給電腦時會變成這樣:
function hero(){
return;
{
Batman: 'Wayne'
}
}
console.log(hero());
函式執行到return就結束了,那這種情況該怎麼處理?
只要return
後面還有其他字符的存在,JS就會知道我們程式還沒結束。
function hero(){
return {
Batman: 'Wayne'
}
}
console.log(hero());
作者認為物件實體語法的{
符號最好接在上一行的句尾,例如for迴圈的{
、if陳述句{
,樣才可以避免一些地方因為被自動加上;
而產生bug。
小結
今天內容稍嫌雜亂,因為跨好幾個影片章節(影片內容也比較短),明天來看看何謂IIFE。
至於筆記對象可以參照Udemy課程:JavaScript 全攻略:克服JS的奇怪部分4-38~4-42的部分