# JavaScript 基礎&ES6 ###### tags: `javascript` :::success :bulb: **小訣竅 :** 左側清單有快速導覽 ::: ## 新手小知識 - onload會等網頁下載完成後才會執行,有圖片會等到圖片都下載完才執行。 ```javascript window.onload = function(){ //在此網頁全都下載完才執行alert喔 alert('Hello JS') } ``` - 變數型別 ```javascript= //三種基本型別: 數值(Number)、字串(String)、布林(Boolean) var number = 1; var string = "我是shawn"; var boolean = true; // 兩種複合型別: 陣列(Array)、物件(Object) var array = []; var object = {}; // 兩種簡單型別: 空值(null)、未定義(undefined) var Null = null; var Undefined; // 特殊型別 : 函式(Function) var fn = function(){}; ``` - 運算子 ```javascript= // 一般運算子(加減乘除) var num1 = 1 + 1; var num2 = 2 - 1; var num3 = 2 * 2; var num4 = 10 / 2; // 特殊運算子轉型 var test1 = "5" + 1; //51 (字串) var test2 = "6" - 1; //5 (數字) var test3 = 1 + "2"; //12 (字串) var test4 = 5 - "2"; //3 (數字) ``` ## Array - [衍伸學習-陣列操作處理](/zGyKqxjKQM-06u1cvOh9Ng) ```javascript= let arr = []; // #push (【新增】至最後面) arr.push('shawn'); arr.push('alice'); console.log(arr); // ['shawn','alice'] // #unshift (【新增】至最前面) arr.unshift('shawn'); arr.unshift('alice'); console.log(arr); // ['alice','shawn'] // #pop(【移除】最後面) let arr2 = ['shawn','alice','nacy']; arr2.pop(); console.log(arr2);// ['shawn','alice'] // #shift(【移除】最前面) let arr3 = ['shawn','alice','nacy']; arr3.shift(); console.log(arr3);// ['alice','nacy'] // #indexOf 取得位置 let arr4 = ['shawn','alice']; console.log(arr4.indexOf('alice')); //1 console.log(arr4.indexOf('alex')); //-1 // #splice(【新增資料至指定位置or移除某筆特定資料】) // array.splice(start[, deleteCount[, item1[, item2[, ...]]]]) // purpose:新增一筆bob至shawn後面 let arr5 = ['shawn','alice']; //新增一筆至shawn後面(需先找到shawn的位置) let shawnIndex = arr5.findIndex(data=>data=='shawn');//0 //由於須放置shawn之後,插入位置+1 arr5.splice(shawnIndex+1,0,'bob'); console.log(arr5);// ['shawn','bob','alice']; // purpose:將bob移除 let arr6 = ['shawn','bob','alice']; //找到bob位置 let bobIndex = arr6.findIndex(data=>data=='bob');//1 //刪除位置為bob,所以不用變動 arr6.splice(bobIndex,1); console.log(arr6);// ['shawn','alice']; ``` ## Object ```javascript= let obj = { name:'shawn', height:180, } // 取得方式 let a = obj.name; let b = obj['name']; // 監控Obj變化 Object.defineProperty() ``` ## String ```javascript= // #String.trim() 去除前後空白 let str1 = ' mike '; console.log(str1.trim()); //mike // #String.slice() 切割字串 // slice(起始位置,數目) 數目沒打切到底 let str2 = 'abc@gmail.com' console.log(str.slice(0,str.indexOf('@'))); //abc console.log(str.slice(3));//@gmail.com // #String.toLocaleLowerCase() 大寫轉小寫 // #String.toLocaleUpperCase() 小寫轉大寫 let str3 = 'shawn'; str3.toLocaleUpperCase();// SHAWN let str4 = 'SHAWN'; str4.toLocaleLowerCase(); //shawn // #字串反轉 let str5 = 'hello'; console.log(str5.split('').reverse().join(''));// olleh // String.replace('取代名稱','取代內容') 字串取代 ps.取代名稱可用正規表達式 let data = '2019-01-01'; console.log(data.replace('/-/g','/')); // String.indexOf(); 取得字串位置 let email = 'abc@gmail.com' console.log(email.indexOf('@')); //3 ``` ## DOM操作 ```javascript= // html <a class="btn"></a> // 獲取對象 let btn = document.querySelector('.btn'); // #操作DOM 屬性 btn.href = "https://google.com"; btn.target = "_black"; // #操作DOM style btn.style.fontSize = '150px'; // #操作DOM 內容 // 1.innerHTML =>可以把HTML Tag做出來 btn.innerHTML = 'hi這是<a>網址</a>'; // 2.innerText =>會一模一樣顯示文字在上頭 btn.innerText = 'hi這是<a>網址</a>'; // #操作DOM class // html <div class="menu"></div> // 獲取對象 let menu = document.querySelector('.menu'); // 操作 menu.classList.add('open'); //新增 menu.classList.remove('open'); //移除 menu.classList.toggle('open'); //切換 menu.classList.contains('open'); //檢查class存不存在 menu.classList.replace("open","close");//替換 //進階 可以類陣列直接轉陣列 (可使用arr全部方法) ex. const pList = [...document.querySelectorAll('p')]; ``` ## 常見的數學函式 Math ```javascript= Math.random(); // #隨傳 0~1 之間的亂數 Math.round(num); // #回傳四捨五入的數字 Math.floor(num); // #去除小數點,回傳正整數 // 要是想要 0~10 呢? Math.random() * 10; // #小數點陷阱 console.log(0.1 + 0.2); //0.30000000000000004 ``` ## OOP 物件導向 - [說明(包含ES6-Class語法糖)](/wxt-QQngQaCrk5YoiGQE_A) ## ES6 ### var,let,const - [變數愛恨情仇](/HnEcdwVRTtC7_KFkud_4Lw) ### 解構賦值 可以使用 「...」 作為剩餘資料的搜集:object,array 也可以使用 「...」 作為將object,array 展開給新的object,array的簡易方法。 ```javascript= //# 陣列解構 let test = ["foo", "bar"]; //old let foo = test[0]; let bar = test[1]; //new let [foo, bar] = test; console.log(foo, bar); //"foo" "bar" //#陣列解構-1 陣列太長情況解構,一樣依照位置其餘不影響 let test = ["foo", "bar","haha","nono"]; let [foo, bar] = test; console.log(foo, bar); //"foo" "bar" //#陣列解構-2 使用「...」可以把剩餘值接收 let test = ["foo", "bar","haha","nono"]; let [foo, bar, ...rest] = test; console.log(rest); //["haha","nono"]; //# 物件解構 let test={ foo:"fooStr", bar:"barStr", test1:'test111', test2:123 } //old let foo = test.foo; let bar = test.bar; let restObj = Object.assign({},{test1:test.test1,test2:test.test2}) // new let {foo,bar,...restObj} =test; console.log(foo,bar,restObj); //fooStr barStr {test1:'test111',test2:123} //# 物件解構-1 重新命名 let {foo:new_foo,bar:new_bar} = test; console.log(new_foo,new_bar); //fooStr barStr //**********************// //# 陣列賦值 let a = ["a1", "a2"]; let b = ["b1", "b2"]; //# old 合併方式 let c = a.concat(b); console.log(c); ["a1", "a2","b1", "b2"]; //# 陣列賦值 new合併方式 let c = [...a,...b]; console.log(c); ["a1", "a2","b1", "b2"]; //# 物件賦值 let test = { a: "testA", b: 123 }; let test_1 = { c: "testC", d: 456 }; //# 物件賦值 old合併方式 let combin = Object.assign(test,test_1); console.log(combin); //{a: "testA",b: 123, c: "testC", d: 456} //# 物件賦值 new合併方式 (也可新增新的key,ex.e) let newCombin ={...test,...test_1,e:789}; console.log(newCombin); //{a: "testA",b: 123, c: "testC", d: 456,e:789} ``` ### 模板字串 ```javascript= let a = 'hello'; let b = 'world'; //結果一樣 hello javascript in the world //old console.log(a+' javascript'+' in the '+b); //new console.log(`${a} javascript in the ${b}`); ``` ## 面試題目 - [面試考題](/gRH-ELmoSWidNhLJaC639g)