es: ESMAScript , 是ECMA制訂的標準化指令。
將程式碼模組化,表示讓這些東西可以被各個檔案所使用。
1. 假設index.js
要使用模組,在html檔引入index.js
時,加上type='module'
。
// index.html
<script type="module" src="./index.js"></script>
module
資料夾,放模組化的檔案module.js
。
有兩種方法可以匯出:export
,export default
。--export
: 公開使用名稱,所以加上{}
,在import時也要加上{}
// module.js
let name = 'jane'
export {name}
// 也可以寫成
export let name = 'jane'
// index.js
import {name} from 'module/module.js'
-- export default
: 一個值,所以不必加上{}
。
// module.js
let name = 'jane'
export default name
// index.js
import name from 'module/module.js'
// 如果加上{}也可以寫成
import {default as name} from 'module/module.js'
箭頭函數裡面this
指的是宣告此函數的區域,在setTimeout裡面如果使用=>
,表示往外一層宣告函式的地方,如下表示,宣告func2的地方是object,因此回傳object。
let object = {
func1: function () {
setTimeout(function () {
// this表示這個函式宣告的地方,setTimeout是在window下宣告的
console.log(this)
}, 1000)
},
func2: function () {
setTimeout(() => {
// this往外一層 產生func2的地方
console.log(this)
}, 1000)
}
}
object.func1()
object.func2()
使用
function foo(height=100){
// 不給直的時候會有預設值
}
取代
function foo(height){
// 當height 是falsy 的時候 0 或空字串 還是會回傳50
let h = height || 50
}
let name = 'jane'
console.log(`hello, I am ${name}`)
可以方便從陣列
或物件
提取值給定義的變數
-- 陣列
let foo = ['one','two','three']
let [first,,third] = foo
console.log(third)
也可以達到交換(解構交換),要記得加分號。
let a =1
// Cannot create property 'undefined' on number '3'
// need to add ; 因為後面會自動沒有換行 let b = 2[a,b] = [b,a]
let b = 2;
[a,b] = [b,a]
console.log(a,b)
-- 物件
記得裡面的名稱要和屬性一樣 否則會出現undefined
const student = {
name2: 'Ming',
age: '18',
city: 'Shanghai'
};
const { name3, age, city } = student;
console.log(name3); // undefined
console.log(age); // "18"
console.log(city); // "Shanghai"
可以延展陣列或物件 -- 用來複製
let arr = [1,2,3]
let arr2 = [...arr]
arr2[0] = 5
// arr2 = [5,2,3]
若key的名稱和變數名稱相同,簡寫如下:
const name = 'jane',age = 22
const worker = {name,age}
// 省了:name
作用域限制在block
,而var
被限制function
。
一種非同步設計的解決方式,包含三種狀態:
pending
,resolve
,reject
。
const promise = new Promise(function(res,rej){
// true 表示非同步成功
if(true){
res()
}else{
rej()
}
})
promise 建構函式接收一個函式做引數,該函式兩個引數第一個會將狀態從pending->resolve
,第二個將狀態從pending->reject
。
生成後可以用then()
回撥結果。
promise.then(function(value){
// success
},function(error){
// failed
})
實際用法:
const logAsync = (msg,time)=>{
return new Promise((res,rej)=>{
if(msg && time){
setTimeout(()=>{
console.log(msg)
res()
},time)
}else{
rej()
}
})
}
// 因為回傳的事Promise結果,所以可以使用then 回撥
logAsync('show after 1s',1000)
.then(()=>{return logAsync('show after 1.5s',1500)})
.then(()=>{return logAsync('show after 2s',2000)})
回傳boolean 值是否包含在陣列。
let arr = ['a','b','c']
arr.includes('c') // true
2**10
來在字串前/後補足一定的字串數量,所帶的參數為(字串的目標長度,用來補足的字串),如果沒有第二個參數的話則是用 " " 代替。
let str = 'test' // len =4
str.padStart(5,'10000')// 用'10000' 來補足 'test'--> '10000test',但其長度超過5
// ,所以只取補足字串左邊起算起---> '10000'
str.padEnd(6,'10000') // 加在字串後面並補足到六位: 'test10'
'0.0'.padEnd(20) // "0.0 "
async是Promise的語法糖(後方可以用then連接),function標記成async,裡面就可以寫await 同步語法(一定要寫在async的function內才可以),表示有結果後再執行下一步。
// async await 搭配 axios 實作
async function getFakeData() {
await axios.get('https://my-json-server.typicode.com/typicode/demo/posts').then(res => {
console.log(res)
})
// 接收到之後才會執行下一行
console.log('after axios')
}
getFakeData().then(() => {
console.log('after async')
})
// res-> after axios -> after async
// 如果把 await 刪除,就沒有同步的效果出現順序:
// after axios -> after async -> res
這些會回傳value陣列, key陣列, 以[key,value] 為元素的陣列。
const myObject = {
a1: 1,
b: 2,
c: 3
};
const { a1, ...x } = myObject;
console.log(a1, x) // 1, {b:2,c:3}
屏東人,前端工程師,愛泰人。