數(shù)組排序
給出正整數(shù)數(shù)組 array = [2,1,5,3,8,4,9,5]?
請(qǐng)寫出一個(gè)函數(shù) sort甥温,使得 sort(array) 得到從小到大排好序的數(shù)組 [1,2,3,4,5,5,8,9]新的數(shù)組可以是在 array 自身上改的锻煌,也可以是完全新開辟的內(nèi)存。不得使用 JS 內(nèi)置的 sort API
答:
let sort = (numbers)=>{
? ? for(let i=0;i<numbers.length-1;i++){
? ? ? ? let index = minIndex(numbers.slice(i))+i? ? ? ? if(index !== i){
? ? ? ? ? ? swap(numbers,index,i)
????????}
????}? ? return numbers
}//需要輔助swap 和minIndex
let swap= (array,x,y)=>{
? ? let temp = array[x]????? ? array[x] = array[y]
? ? array[y] = temp
}
let minIndex = (numbers)=>{
? ? let index =0? ? for(let i=1;i<numbers.length;i++){
? ? ? ? if(numbers[i]<numbers[index]){
? ? ? ? ? ? index = i
????????}
????}????return index
}sort.call(null,[2,1,5,3,8,4,9,5])
你對(duì) Promise 的了解姻蚓?
①Promise 的用途:
答:是為了解決命名不規(guī)范炼幔、回調(diào)地獄使得代碼復(fù)雜、很難進(jìn)行錯(cuò)誤處理等問題(通俗的說 就是Promise?能規(guī)范回調(diào)的名字或順序史简、拒絕回調(diào)地獄、讓代碼可讀性更強(qiáng)、很方便的捕獲錯(cuò)誤 )
②如何創(chuàng)建一個(gè) new Promise(課堂里讓大家背過)
答:
return new Promise((resolve,reject)=>{
? ? //內(nèi)容區(qū)? 任務(wù)成功調(diào)用resolve 失敗調(diào)用reject
})?
③如何使用 Promise.prototype.then(可查 MDN)
答:?
const flag= true
const promise = new Promise((resolve,reject)=>{
? ? if(flag){
? ? ? ? resolve('成功了')
????}else{
? ? ? ? reject('失敗了')
????}
})promise?
? ? .then(name=>{ //成功返回then
? ? ? ? console.log(`我的then調(diào)用${name}`)?
????})? ? .catch(name =>{ //失敗返回catch
? ? ? ? console.log(`我的catch調(diào)用${name}`)
????})? ? .finally(()=>{?
? ? ? ? console.log(`成功失敗都返回`)
????})
④如何使用 Promise.all(可查 MDN)
答: Promise.all可以將多個(gè)Promise實(shí)例包裝成一個(gè)新的Promise實(shí)例圆兵。同時(shí)跺讯,成功和失敗的返回值是不同的,成功的時(shí)候返回的是一個(gè)結(jié)果數(shù)組殉农,失敗時(shí)返回最先被reject失敗狀態(tài)的值
Promise.all的使用:?
let? p1 = new Promise((resolve,reject)=>{
? ? resolve('成功了')
})let p2 = new Promise((resolve,reject)=>{
? ? resolve('成功了2222222')
})let p3 = new Promise((resolve,reject)=>{
? ? reject('失敗')
})Promise.all([p1,p2]).then(result=>{
? ? console.log(result)
}).catch(error=>{
? ? console.log(error)
})
Promise.all([p1,p3,p2]).then((result)=>{
? ? console.log(result)
}).catch((error)=>{
? ? console.log(error) //Promise.all 在任意一個(gè)傳入的promise失敗時(shí)返回失敗刀脏,即有一個(gè)立即調(diào)用失敗函數(shù),那么Promise.all將立即變?yōu)槭?br>})
Promise.all?的異步和同步 :
Promise.all在處理多個(gè)異步和同步處理時(shí)非常有用超凳,比如說一個(gè)頁面上需要等兩個(gè)或者多個(gè)ajax的數(shù)據(jù)回來以后才正常顯示愈污,在此之前只顯示loading圖標(biāo)
let wake = time =>{
? ? return new Promise((resolve,reject)=>{
? ? ? ? setTimeout(()=>{
? ? ? ? ? ? resolve(`${time/1000}秒后醒來`)
????????},time)
????})
}let p1 = wake(5000)
let p2 = wake(3000)
Promise.all([p1,p2]).then((result)=>{
? ? console.log(result)
}).catch((error)=>{
? ? console.log(error)
})需要注意的是,Promise.all 獲得的成功結(jié)果的數(shù)組里面的數(shù)據(jù)順序和Promise.all接收到的數(shù)組順序是一致的轮傍,即p1的結(jié)果在前暂雹,即便p1的結(jié)果獲取的比p2要晚,這帶來了一個(gè)絕大的好處:在前端開發(fā)請(qǐng)求數(shù)據(jù)的過程中 偶爾會(huì)遇到發(fā)送多個(gè)請(qǐng)求并根據(jù)請(qǐng)求順序獲取和使用數(shù)據(jù)的場景创夜,使用Promise.all毫無疑問可以解決這個(gè)問題杭跪。
⑤如何使用 Promise.race(可查 MDN)
答:race 誰跑得快執(zhí)行誰
let p1 = new Promise(function(resolve,reject){?
setTimeout(resolve,500,"one") })?
let p2=new Promise(function(resolve,reject){?
setTimeout(resolve,100,'two') })?
Promise.race([p1,p2]).then(function(value){ console.log(value) })
跨域
①什么是同源
答:如果兩個(gè)url的協(xié)議、域名驰吓、端口號(hào)完全一致涧尿,那么這兩個(gè)url就是同源的
? ? ? ?比如:https://baidu.com、https://www.baidu.com不同源 //完全一致才算同源
②什么是跨域
當(dāng)一個(gè)請(qǐng)求的協(xié)議檬贰、域名姑廉、子域名、端口之間任意一個(gè)與當(dāng)前頁面url不同即為跨域
③JSONP 跨域
最主要思路讓js包含數(shù)據(jù)
④CORS 跨域
Access-Control-Allow-Origin : http://lulu.com:8880