js用递归遍历多维数组_js面试题更新之40
1、數(shù)組方法pop() push() unshift() shift()
push ????后面添加元素,個(gè)數(shù)不限,返回新數(shù)組的長度
pop ????從后面刪除一個(gè)元素,返回那個(gè)元素
unshift ??從前面添加元素,個(gè)數(shù)不限,返回新數(shù)組的長度
shift ????從前面刪除一個(gè)元素,返回那個(gè)元素
2、javascript的typeof返回哪些數(shù)據(jù)類型
Object ?number ?function ?Boolean ?underfind
(注意這里沒有null,null是一個(gè)空對象,是Object的類型。undefined隱形轉(zhuǎn)換數(shù)字為NaN,不是任何值,不等于NaN本身。null隱形轉(zhuǎn)換數(shù)字文0。強(qiáng)制轉(zhuǎn)化都為NaN。)
3、split() join() 的區(qū)別
split() 字符串的方法,把字符串分割成數(shù)組 ??split(“,”)
join() ?數(shù)組的方法,把數(shù)組連接成字符串 ??join(“--”)
4、輸出的值是什么:
var arr = [1, 2, 3, 4, 5, 5] ????for?(var?i?=?0;?i????????setTimeout(function(){?????????????????console.log(i)?????? }) //輸出6次6。setTimeout()是異步操作。var定義變量是存在變量提升,//當(dāng)i=6時(shí)循環(huán)停止,才開始執(zhí)行6次console.log(i) } for?(let?i?=?0;?i????setTimeout(function(){??????????? console.log(i)?????????})?????? } //輸出0 1 2 3 4 5 。let不存在變量提升,可以形成塊級作用域for?(var?i?=?0;?i????setTimeout(function(){??????????? console.log(arr[i])?????????})?????? } //輸出6次undefinedfor?(let?i?=?0;?i????setTimeout(function(){??????????? console.log(arr[i])?????????})?????? } //輸出 1 2 3 4 5 55、前端有哪幾種本地存儲(chǔ)方式,簡述各自的特點(diǎn)(請描述一下cookies,sessionStorage和localStorage的區(qū)別?)
前端有三種本地存儲(chǔ)的方式:cookie、localStorage 、?sessionStorage
cookie---最大數(shù)據(jù)量為4kb左右,存儲(chǔ)量小,可以設(shè)置有效期,默認(rèn)為會(huì)話級別。是基于http的。
localStorage---有效期永久,存多了,不主動(dòng)刪除,會(huì)造成瀏覽器很卡。同源可以修 改localStorage的數(shù)據(jù)。
sessionStorage:有效期頂層窗口關(guān)閉錢,數(shù)據(jù)在頁面會(huì)話結(jié)束的時(shí)候會(huì)被清除,屬 ??于臨時(shí)保存同一窗口的數(shù)據(jù)。最大容量有5M左右。
6、簡述常見的http狀態(tài)碼
200 請求成功
304 服務(wù)器已經(jīng)執(zhí)行了請求,當(dāng)文件沒有變化 ,簡單講有緩存了。?
404 Not Found
500 服務(wù)端錯(cuò)誤
7、從輸入U(xiǎn)RL到頁面加載發(fā)生了什么? ?????
? 1、DNS解析 (把域名解析為相應(yīng)的ip地址)
??????????2、TCP連接?(三次握手的過程)
??????????3、發(fā)送HTTP請求
??????????4、服務(wù)器處理請求并返回HTTP報(bào)文
??????????5、瀏覽器解析渲染頁面
??????????6、連接結(jié)束?(斷開連接過程是四次揮手的過程)
8、Promise構(gòu)造函數(shù)是同步執(zhí)行還是異步執(zhí)行,那么 then 方法呢?
Promise構(gòu)造函數(shù)是同步執(zhí)行的,then方法是異步執(zhí)行的
9、setTimeout、Promise、async/await 的區(qū)別?
??????事件循環(huán)(Event?Loop)中分為宏任務(wù)隊(duì)列和微任務(wù)隊(duì)列
? ? ? ?setTimeout的回調(diào)函數(shù)放到宏任務(wù)隊(duì)列里,等到執(zhí)行棧清空以后執(zhí)行
?promise.then里的回調(diào)函數(shù)會(huì)放到相應(yīng)宏任務(wù)的微任務(wù)隊(duì)列里,等宏任務(wù)里面的同步代碼執(zhí)行完再執(zhí)行
async函數(shù)表示函數(shù)里面可能會(huì)有異步方法,await后面跟一個(gè)表達(dá)式。async方法執(zhí)行時(shí),遇到await會(huì)立即執(zhí)行表達(dá)式,然后把表達(dá)式后面的代碼放到微任務(wù)隊(duì)列里,讓出執(zhí)行棧讓同步代碼先執(zhí)行
補(bǔ)充:promise?是es6新增一種異步編程的方案
??????async/await是es7中新增的異步編程的方案。
經(jīng)典案例:今日頭條的面試題,執(zhí)行的順序
async?function?async1?()?{??console.log('async1?start')?//?2??await?async2(); console.log('async1?end')????//7}async?function?async2?()?{??console.log('async2')??????//3}console.log('script start') // 1setTimeout(function () {??console.log('setTimeout')???//8}, 0)async1();new?Promise?(function?(resolve)?{??console.log('promise1')???//4???resolve();}).then?(function?()?{??console.log('promise2')??//6})console.log('script end') //5運(yùn)行結(jié)果:1、 script start2、 async1 start3、 async24、 promise15、 script end6、 promise27、 async1 end8、 setTimeout10、forEach、for in、for of三者區(qū)別
???????forEach:用來遍歷數(shù)組,對數(shù)組中的每個(gè)元素執(zhí)行一次提供的函數(shù),不改變原數(shù)組,無返回值,undefined。
for in 一般常用來遍歷對象或json。
for of數(shù)組對象都可以遍歷。其中遍歷對象使用Object.keys()
例:arr.forEach(function(value,index,arr){代碼段})
例:let obj={a:1,b:2} ??for(let o in obj){?console.log(o) ??//a b }
例:let?arr=[‘China’,’korea’] ??let obj={a:1,b:2}
for(let o of arr){console.log(o) ?// China Korea}
for(let o of Object.keys(obj)){?????//直接寫for(let o of obj)報(bào)錯(cuò)
console.log(o) ?}?// a?b ?對象中的鍵
11、手寫一個(gè)?Promise(中高級必考)什么是promise?promise是用來干啥的?解決了什么問題?
Promise是異步編程的一個(gè)解決方案,主要用來解決兩個(gè)問題:1、解決異步的問題,2、解決回調(diào)地獄的,就是第一個(gè)函數(shù)的輸出是第二個(gè)函數(shù)的輸入的這種現(xiàn)象。
let promise=new Promise((resolve,reject)=>{If(異步操作成功){resolve(value);}else{reject(error); //操作失敗}})promise.then(function(value){ //success },function(error){ //failure }) //promise.then()兩個(gè)參數(shù),第二個(gè)參數(shù)可選Promise?對象的三種狀態(tài):pending(正在進(jìn)行)、fulfilled(成功)、rejected(失敗)。
狀態(tài)只能pending到fulfilled或者pending到rejected,狀態(tài)一旦改變不能再變。
12、對象、數(shù)組的深拷貝淺拷貝
淺拷貝:就是流于表面的拷貝方式,淺拷貝只拷貝的對象的地址,也就是說兩個(gè)對象指向的是同一地址,修改其中的一個(gè)對象的屬性,另一個(gè)對象的屬性也會(huì)修改。
深拷貝:完全拷貝,拷貝之后新舊數(shù)據(jù)完全分離,不再共用對象類型的屬性值,不會(huì)相互影響。
13、手寫一個(gè)js深拷貝??(先理解什么是深拷貝)
乞丐版:
01、var newObj=JSON.parse(JSON.stringify(obj))無法復(fù)制函數(shù),丟失原型鏈,對于多維數(shù)組也有效02、var newArr=arr.slice() 或者arr.concat() 只能實(shí)現(xiàn)一維數(shù)組的深拷貝03、var […newArr]=arres6擴(kuò)展運(yùn)算法實(shí)現(xiàn)數(shù)組的深拷貝(當(dāng)然數(shù)組中沒有屬性值沒有對象的時(shí)候)04、var {…obj2}=obj05、對象只有一層的話可以使用Object.assign()函數(shù)var newobj=Object.assign({},obj)面試夠用版(判斷是數(shù)組還是對象,新建一個(gè)數(shù)組或者對象,通過for?in循環(huán)數(shù)組對象,完成深拷貝)?遞歸拷貝
function?deepCopy(obj){?????//判斷是否是簡單數(shù)據(jù)類型if(typeof?obj?==?"object"){????//復(fù)雜數(shù)據(jù)類型?????????var?result?=?obj.constructor?==?Array???[]?:?{};?????????for(let?i?in?obj){????????????? result[i]?=?typeof?obj[i]?==?"object"??deepCopy(obj[i])?:?obj[i];???}??????//遞歸判斷?}else?{????//簡單數(shù)據(jù)類型?直接?==?賦值?????????var?result?=?obj;?????}?????return?result;}14、數(shù)組去重手寫
利用es6中Set去重
var arr = [1,2,2,23,23,undefined,undefined]; var newarr = Array.from(new Set(arr)) console.log(newarr) // [1, 2, 23, undefined]補(bǔ)充:ES6提供了一個(gè)新的數(shù)據(jù)結(jié)構(gòu)Set,本身是一個(gè)構(gòu)造函數(shù),用來生成Set的數(shù)據(jù)結(jié)構(gòu)。類似于數(shù)組,但是成員的屬性都是唯一的,沒有重復(fù)的值。雙重for循環(huán)+splice()方法
function?single(arr){ for(var?i=0;i for(var?j=i+1;j if(arr[i]==arr[j]){ arr.splice(j,1); j--;??//arr的長度變了 } }} return??arr;}var?arr?=?[1,2,2,23,23,undefined,undefined];?????console.log(single(arr)) // [1, 2, 23, undefined]利用indexOf去重
var arr = [1,2,2,23,23,undefined,undefined]; var newapp=[];for(var i=0;iif(newapp.indexOf(arr[i])===-1){newapp.push(arr[i])}} console.log(newapp) // [1, 2, 23, undefined]新建一個(gè)空數(shù)組,for循環(huán)判斷新數(shù)組中是否存在原數(shù)組中元素,如果有相同的值則跳過,不相同push到新數(shù)組。
15、冒泡排序和選擇排序
冒泡排序:相鄰兩個(gè)元素比較
相鄰兩個(gè)元素進(jìn)行比較,將一個(gè)數(shù)組中數(shù)字使用循環(huán)進(jìn)行升序或排序的
arr = [1, 2, 3, 4] for (var j = 0; j < arr.length; j++) { for (var i = 0; i < arr.length; i++) { if (arr[i] < arr[i + 1]) { var a = arr[i] arr[i] = arr[i + 1] arr[i + 1] = a; } } }選擇排序:先找值
這種排序方式先找最大的,排在最左側(cè),然后找第二個(gè)往左靠。。。。
arr = [1, 2, 3, 4] for (var i = 0; i < arr.length - 1; i++) { for (var j = i + 1; j < arr.length; j++) { if (arr[i] < arr[j]) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } } }冒泡排序和順序排序(劃重點(diǎn))。
(1)冒泡排序是比較相鄰位置的兩個(gè)數(shù),而選擇排序是按順序比較,找最大值或者最小值;
(2)冒泡排序每一輪比較后,位置不對都需要換位置,選擇排序每一輪比較都只需要換一次位置;
(3)冒泡排序是通過數(shù)去找位置,選擇排序是給定位置去找數(shù);
總結(jié):一般選擇排序優(yōu)于冒泡排序。因?yàn)槊看闻判蛑恍枰粨Q一位置。冒泡排序比較耗性能。
16、?淺談async/await
????1、async聲明一個(gè)異步async?function fun(){….}
自動(dòng)將常規(guī)的函數(shù)轉(zhuǎn)換成Promise ,返回值也是一個(gè)Promise對象。
只有async函數(shù)內(nèi)部的異步操作執(zhí)行完,才會(huì)執(zhí)行then方法指定的回調(diào)函數(shù)。
??異步函數(shù)內(nèi)部可以使用await
??2、await?等待異步功能執(zhí)行 var?result=await?new?Promise()
?放置在Promise調(diào)用之前,await強(qiáng)制其他代碼等待,直到Promise完成并返回結(jié)果
只能與Promise一起使用,不適于回調(diào)。
只能在async函數(shù)內(nèi)部使用。
17、事件循環(huán)
function printing() { console.log(1); setTimeout(function() { console.log(2); }, 1000); setTimeout(function() { console.log(3); }, 0); console.log(4); } // 1 4 3 2??理解:javascritpt是一門單線程的語言。
js分為同步任務(wù)和異步任務(wù)。事件循環(huán)分為宏任務(wù)和微任務(wù)。
同步任務(wù)在主線程上執(zhí)行,形成一個(gè)執(zhí)行棧,主線程之外,事件觸發(fā)線程管理著一個(gè)任務(wù)隊(duì)列,只要異步任務(wù)有了運(yùn)行結(jié)果,就在任務(wù)隊(duì)列中放置一個(gè)事件。
一旦執(zhí)行棧中的所有同步任務(wù)執(zhí)行完畢,系統(tǒng)就會(huì)讀取任務(wù)隊(duì)列,將可執(zhí)行的異步任務(wù)添加到執(zhí)行棧中,開始執(zhí)行。
執(zhí)行順序:執(zhí)行棧中的任務(wù)----事件循環(huán)中宏任務(wù)------事件循環(huán)中的微任務(wù)
同步任務(wù)交給主線程,主線程之外事件觸發(fā)線程管理一個(gè)任務(wù)隊(duì)列,為異步任務(wù)。
18、ajax請求的時(shí)候get 和post方式的區(qū)別
1、get請求會(huì)將參數(shù)跟在url后面進(jìn)行參數(shù)傳遞,而post請求則是作為http消息的實(shí)體內(nèi)容發(fā)送給web服務(wù)器。
2、get提交的數(shù)據(jù)大小有限制,這個(gè)限制是url的整體長度而不是參數(shù)的長度。post提交沒有這個(gè)限制。
3、get請求的數(shù)據(jù)會(huì)被瀏覽器緩存起來,帶來嚴(yán)重的安全問題,而post相對來說可以避免這些問題。
4、一般情況下。Get請求用來請求數(shù)據(jù),post請求用來提交數(shù)據(jù)。
19、Javascript垃圾(GC)回收機(jī)制
Javascript垃圾回收機(jī)制原理:為了防止內(nèi)存泄漏,垃圾回收機(jī)制會(huì)定期的清理哪些不再用到內(nèi)存變量,然后釋放其內(nèi)存。
現(xiàn)在各大瀏覽器的通常采用的垃圾回收機(jī)制的兩種方法:標(biāo)記清除、引用計(jì)數(shù)?
Js最常用的垃圾回收方式是標(biāo)記清除,當(dāng)變量進(jìn)入環(huán)境時(shí),將這個(gè)變量標(biāo)記為“進(jìn)入環(huán)境”,當(dāng)這個(gè)變量離開環(huán)境時(shí)標(biāo)記“離開環(huán)境”。標(biāo)記為‘離開環(huán)境’的就回收內(nèi)存。
20、閉包是什么,有什么特性,對頁面有什么影響
閉包是指有權(quán)訪問另—個(gè)函數(shù)作用域中變量的函數(shù)。創(chuàng)建閉包的最常見的方式就是在—個(gè)函數(shù)內(nèi)創(chuàng)建另—個(gè)函數(shù),通過另—個(gè)函數(shù)訪問這個(gè)函數(shù)的局部變量,利用閉包可以突破作用鏈域,將函數(shù)內(nèi)部的變量和方法傳遞到外部。
閉包的特性:
1.函數(shù)內(nèi)再嵌套函數(shù)
2.內(nèi)部函數(shù)可以引用外層的參數(shù)和變量
3.參數(shù)和變量不會(huì)被垃圾回收機(jī)制回收,使變量私有化,容易造成內(nèi)存的泄漏。
21、”==”和“===”的不同
前者會(huì)自動(dòng)轉(zhuǎn)換類型,再判斷是否相等,后者不會(huì)自動(dòng)類型轉(zhuǎn)換,直接去比較
22、函數(shù)聲明與函數(shù)表達(dá)式的區(qū)別?
定義函數(shù)的三種方式1、函數(shù)聲明?2、函數(shù)表達(dá)式3、new Function構(gòu)造函數(shù)。
在Javscript中,解析器在向執(zhí)行環(huán)境中加載數(shù)據(jù)時(shí),對函數(shù)聲明和函數(shù)表達(dá)式并非是一視同仁的,解析器會(huì)率先讀取函數(shù)聲明(函數(shù)提升),并使其在執(zhí)行任何代碼之前可用(可以訪問),至于函數(shù)表達(dá)式,則必須等到解析器執(zhí)行到它所在的代碼行,才會(huì)真正被解析執(zhí)行。
hello()
function?hello(){
console.log(“函數(shù)的聲明”)
}
fun() ??//這里會(huì)報(bào)錯(cuò)!
var fun=function(){
console.log(“函數(shù)表達(dá)式”)
}
23、null和undefined的區(qū)別?
null是一個(gè)表示"無"的對象,轉(zhuǎn)為數(shù)值時(shí)為0;undefined是一個(gè)表示"無"的原始值,轉(zhuǎn)為數(shù)值時(shí)為NaN。當(dāng)聲明的變量還未被初始化時(shí),變量的默認(rèn)值為undefined。null用來表示尚未存在的對象
undefined表示"缺少值",就是此處應(yīng)該有一個(gè)值,但是還沒有定義。典型用法是:
(1)變量被聲明了,但沒有賦值時(shí),就等于undefined。
(2)調(diào)用函數(shù)時(shí),應(yīng)該提供的參數(shù)沒有提供,該參數(shù)等于undefined。
(3)對象沒有賦值的屬性,該屬性的值為undefined。
(4)函數(shù)沒有返回值時(shí),默認(rèn)返回undefined。
null表示"沒有對象",即該處不應(yīng)該有值。典型用法是:
(1) 作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對象。
(2) 作為對象原型鏈的終點(diǎn)。
24、new操作符具體干了什么呢?(面對對象)
1、創(chuàng)建一個(gè)空對象
2、將構(gòu)造函數(shù)中的this指向這個(gè)對象
3、將屬性和方法綁定到這個(gè)對象上
4、隱式返回這個(gè)對象
25、如何獲取javascript三個(gè)數(shù)中的最大值和最小值?
Math.max(a,b,c);//最大值
Math.min(a,b,c)//最小值
Math.max(…arr) //arr是一個(gè)數(shù)組[2,5,66,7] 返回66 ?擴(kuò)展符
26、?閉包的優(yōu)點(diǎn):(32特點(diǎn))
(1)希望一個(gè)變量長期駐扎在內(nèi)存當(dāng)中(不被垃圾回收機(jī)制回收)
(2)避免全局變量的污染
(3)私有成員的存在
27、如何優(yōu)化網(wǎng)頁加載速度?
1、壓縮 css和 Js 代碼 ,減少css和js的文件大小
2、合并js、css文件,減少http請求
3、將css樣式放在頂部,將js腳本放在底部
4、減少DOM操作,盡可能的用變量代替不必要的dom操作。
5、使用外部的js和css。
28、你如何優(yōu)化自己的代碼?
1、代碼重用:
2、避免全局變量(命名空間,封閉空間,模塊化mvc..)
3、拆分函數(shù)避免函數(shù)過于臃腫
4、適當(dāng)?shù)淖⑨?/p>
5、變量命名規(guī)范
6、內(nèi)存管理,尤其是閉包中的變量的釋放。
29、重繪和回流(重排)
回流(重排):
1、當(dāng)render tree 中的一部分(或全部)因?yàn)樵氐囊?guī)模尺寸,布局、隱藏等改變而需要重新構(gòu)建,這就稱為回流
2、當(dāng)頁面布局和幾何屬性改變時(shí)就需要回流
什么是重繪?
1、當(dāng)render tree 中的一些元素需要更新屬性,而這些屬性只是影響元素的外觀,風(fēng)格,而不會(huì)影響布局的,比如background-color。則就稱為重繪。
回流必將引起重繪,而重繪不一定會(huì)引起回流
30、棧和堆的區(qū)別?
棧(stack):由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量等;
堆(heap):一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由操作系統(tǒng)釋放
31、Javascript作用鏈域
作用域鏈的原理和原型鏈很類似,如果這個(gè)變量在自己的作用域中沒有,那么它會(huì)尋找父級的,直到最頂層。
注意:JS沒有塊級作用域,若要形成塊級作用域,可通過(function(){})();立即執(zhí)行的形式實(shí)現(xiàn)
32、?談?wù)則his的理解-------(this永遠(yuǎn)指向最后調(diào)用它的對象,也就是執(zhí)行的時(shí)候誰調(diào)用的)
01、普通函數(shù)中的this代表window。
02、事件中的this代表的事件源(特殊IE瀏覽器attchEvent中的this總指向去全局對象window)
03、定時(shí)器中函數(shù)代表的window
04、自調(diào)用的函數(shù)中額this指向window
05、對象中的方法中this的代表的是當(dāng)前對象
06、箭頭函數(shù)中this指向定義時(shí)的上一層作用域中this
(補(bǔ)充:箭頭函數(shù)本身沒有this和arguments的,在箭頭函數(shù)中引用this實(shí)際上是調(diào)用定義時(shí)的上一層作用域的this。這里強(qiáng)調(diào)是上一層的作用域,是因?yàn)閷ο笫遣荒苄纬瑟?dú)立作用域的。)
?33、es5和es6的區(qū)別,說一下你所知道的es6
?ES6新增的一些特性:
?01、聲明變量的關(guān)鍵字:let、const-------兩個(gè)都有塊級作用域且var?有變量提升。
?02、箭頭函數(shù)
03、模板字符串------模板字符串是增強(qiáng)版的字符串,用反引號(`)標(biāo)識,可以當(dāng)作普通字符串使用,也可以用來定義多行字符串
?04、 解構(gòu)賦值--------ES6 允許按照一定模式,從數(shù)組和對象中提取值,對變量進(jìn)行賦值
?05、for of循環(huán)--------for...of循環(huán)可以遍歷數(shù)組、Set和Map結(jié)構(gòu)、某些類似數(shù)組的對象、對象,以及字符串
?06、import、export導(dǎo)入導(dǎo)出----在es6中文件可以默認(rèn)為一個(gè)模塊,模塊通過export向外暴露接口。通過import導(dǎo)入一個(gè)模塊,注意import和export只能出現(xiàn)在模塊的最外層結(jié)構(gòu)中能夠,否則報(bào)錯(cuò)。
?07、Set數(shù)據(jù)結(jié)構(gòu)----Set數(shù)據(jù)結(jié)構(gòu)類似數(shù)組,所有的數(shù)據(jù)都是唯一的,沒有一個(gè)重復(fù)值,它本身是一個(gè)構(gòu)造函數(shù)。
?08、展開運(yùn)算符----?…
?09、class類的繼承---?ES6中不再像ES5一樣使用原型鏈實(shí)現(xiàn)繼承,而是引入class這個(gè)概念
10、Promise------es6提供的一個(gè)異步編程的方案。
11、Proxy代理------使用代理監(jiān)聽對象的操作
12、修飾器------?decorator?是一個(gè)函數(shù),用于修改類似與方法的行為
13、Symbol-----?新的原始數(shù)據(jù)類型。Symbol 通過調(diào)用symbol函數(shù)產(chǎn)生,它接收一個(gè)可選的名字參數(shù),該函數(shù)返回的symbol是唯一的
34、var、let、const之間的區(qū)別
?var聲明變量可以重復(fù)聲明,而let不可以重復(fù)聲明
var是不受限于塊級的,而let是受限于塊級
var會(huì)與window相映射(會(huì)掛一個(gè)屬性),而let不與window相映射
var可以在聲明的上面訪問變量,而let有暫存死區(qū),在聲明的上面訪問變量會(huì)報(bào)錯(cuò)
const聲明之后必須賦值,否則會(huì)報(bào)錯(cuò)
const定義不可變的量,改變了就會(huì)報(bào)錯(cuò)
const和let一樣不會(huì)與window相映射、支持塊級作用域、在聲明的上面訪問變量會(huì)報(bào)錯(cuò)
35、使用箭頭函數(shù)應(yīng)注意什么?
(1)箭頭函數(shù)中的this,不是指向window,而是父級。
(2)不能使用arguments對象(箭頭函數(shù)中沒有this和arguments對象)
(3)不能用作構(gòu)造函數(shù),就是不能使用new命令,否則會(huì)跑出錯(cuò)誤。
(4)不可以使用yeild命令。因此箭頭函數(shù)不能用作Generator函數(shù)
(補(bǔ)充:Generator函數(shù)作為一個(gè)用來操作異步的狀態(tài)機(jī),遇到y(tǒng)eild停止,通過調(diào)用next()來繼續(xù)操作,一:function關(guān)鍵字與函數(shù)名之間有一個(gè)星號,函數(shù)體使用yeild(類似return)產(chǎn)出不同的狀態(tài)。)
36、ECMAScript 6 怎么寫 class ,為何會(huì)出現(xiàn) class?
ES6的class可以看作是一個(gè)語法糖,它的絕大部分功能ES5都可以做到,新的class寫法只是讓對象原型的寫法更加清晰、更像面向?qū)ο缶幊痰恼Z法
class?Person{constructor(name){?????????this.name=name??//this關(guān)鍵字代表實(shí)例對象 } say(){????? console.log(123) }}var person =new Person(‘張三’);person.say()37、說一下es6的導(dǎo)入導(dǎo)出模塊
導(dǎo)入通過import關(guān)鍵字
import {sum} from "./example.js" ?導(dǎo)入一個(gè)模塊中一個(gè)成員
import {sum,multiply,time} from "./exportExample.js" ?//導(dǎo)入多個(gè)
import * as example from "./exportExample.js" ???//導(dǎo)入一整個(gè)模塊
導(dǎo)出通過export關(guān)鍵字
export var name?= 'Michael';
export {firstName, lastName, year};
使用export default時(shí),對應(yīng)的import語句不需要使用大括號
let bosh = function crs(){ }
export default bosh; //導(dǎo)出
import crc from 'crc'; //導(dǎo)入
不使用export default時(shí),對應(yīng)的import語句需要使用大括號
let bosh = function crs(){ }
export bosh; //導(dǎo)出
import {crc} from 'crc'; //導(dǎo)入
在es6中文件可以默認(rèn)為一個(gè)模塊,模塊通過export向外暴露接口。通過import導(dǎo)入一個(gè)模塊,注意import和export只能出現(xiàn)在模塊的最外層結(jié)構(gòu)中能夠,否則報(bào)錯(cuò)。
Export default向外暴露成員只允許一次
38、http和https?區(qū)別;
HTTP協(xié)議傳輸?shù)臄?shù)據(jù)都是未加密的,也就是明文的,因此使用HTTP協(xié)議傳輸隱私信息非常不安全,為了保證這些隱私數(shù)據(jù)能加密傳輸,于是網(wǎng)景公司設(shè)計(jì)了SSL(Secure Sockets Layer)協(xié)議用于對HTTP協(xié)議傳輸?shù)臄?shù)據(jù)進(jìn)行加密,從而就誕生了HTTPS。簡單來說,HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,要比http協(xié)議安全。
HTTPS和HTTP的區(qū)別主要如下:
1、https協(xié)議需要到ca申請證書,一般免費(fèi)證書較少,因而需要一定費(fèi)用。
2、http是超文本傳輸協(xié)議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協(xié)議。
3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
4、http的連接很簡單,是無狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、
身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全。
39、簡述readyonly與disabled的區(qū)別:
1、readonly 只針對input(type為text和password)和textarea有效。而disabled對于所有的表單元素都有效。
2、當(dāng)表單元素使用了disabled后,當(dāng)我們將表單以PSOT和get方式提交的話,這個(gè)元素的值不會(huì)被傳遞出去,而readonly將會(huì)把值傳遞出去。
40、同步和異步的區(qū)別:同步異步主要是事情做完以后,如何進(jìn)行處理、或者說關(guān)注的是一種消息通信機(jī)制。
????????????同步:同步相當(dāng)于當(dāng)客戶端發(fā)送請求給服務(wù)端。在等待服務(wù)端的響應(yīng)請求時(shí),客戶端不做其他事情。
當(dāng)服務(wù)端做完了才返回給客戶端,這樣的話客戶端一直等待,用戶使用起來不友好。
異步:當(dāng)客戶端發(fā)送給服務(wù)器請求時(shí),在等待服務(wù)器響應(yīng)的時(shí)候嗎,客戶端可以做其他的事情,不用等待服務(wù)端的響應(yīng),
總結(jié)
以上是生活随笔為你收集整理的js用递归遍历多维数组_js面试题更新之40的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker 安装nginx_使用 Do
- 下一篇: laravel redis_如何将red