1、介紹js的基本數(shù)據(jù)類型
答: Undefined、Null、Boolean、Number、String
2、js有哪些內(nèi)置對象?
答:數(shù)據(jù)封裝類對象:Object、Array、Boolean、Number 和 String
其他對象:Function、Arguments、Math、Date、RegExp、Error
3、this對象的理解
答:this總是指向函數(shù)的直接調(diào)用者(而非間接調(diào)用者);
如果有new關(guān)鍵字,this指向new出來的那個對象;
在事件中,this指向觸發(fā)這個事件的對象,特殊的是,IE中的attachEvent中的this總是指向全局對象Window。
可以看看我前面的文章 this在不同情況下的指向
4、eval是做什么的?
答:它的功能是把對應的字符串解析成JS代碼并運行;
應該避免使用eval,不安全,非常耗性能(2次,一次解析成js語句,一次執(zhí)行)。
由JSON字符串轉(zhuǎn)換為JSON對象的時候可以用eval,var obj =eval(’(’+ str +’)’)。
5、DOM怎樣添加、移除、移動、復制、創(chuàng)建和查找節(jié)點
答:// 創(chuàng)建新節(jié)點
createDocumentFragment() //創(chuàng)建一個DOM片段
createElement() //創(chuàng)建一個具體的元素
createTextNode() //創(chuàng)建一個文本節(jié)點
// 添加、移除、替換、插入
appendChild()
removeChild()
replaceChild()
insertBefore() //在已有的子節(jié)點前插入一個新的子節(jié)點
// 查找
getElementsByTagName() //通過標簽名稱
getElementsByName() //通過元素的Name屬性的值(IE容錯能力較強,會得到一個數(shù)組,其中包括id等于name值的)
getElementById() //通過元素Id,唯一性
6、null和undefined的區(qū)別?
答:null是一個表示"無"的對象,轉(zhuǎn)為數(shù)值時為0;undefined是一個表示"無"的原始值,轉(zhuǎn)為數(shù)值時為NaN。
undefined:
?。?)變量被聲明了,但沒有賦值時,就等于undefined。
?。?) 調(diào)用函數(shù)時,應該提供的參數(shù)沒有提供,該參數(shù)等于undefined。
(3)對象沒有賦值的屬性,該屬性的值為undefined。
?。?)函數(shù)沒有返回值時,默認返回undefined。
null:
?。?) 作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對象。
?。?) 作為對象原型鏈的終點。
7、new操作符具體干了什么呢?
答:
?。?)創(chuàng)建一個空對象,并且 this 變量引用該對象,同時還繼承了該函數(shù)的原型。
(2)屬性和方法被加入到 this 引用的對象中。
(3)新創(chuàng)建的對象由 this 所引用,并且最后隱式的返回 this 。
8、JSON 的了解?
答:
JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式。它是基于JavaScript的一個子集。數(shù)據(jù)格式簡單, 易于讀寫, 占用帶寬小。
格式:采用鍵值對,例如:{“age”:“12”, “name”:“back”}
9、call() 和 apply() 的區(qū)別和作用?
答:
apply()函數(shù)有兩個參數(shù):第一個參數(shù)是上下文,第二個參數(shù)是參數(shù)組成的數(shù)組。如果上下文是null,則使用全局對象代替。
如:function.apply(this,[1,2,3]);
call()的第一個參數(shù)是上下文,后續(xù)是實例傳入的參數(shù)序列。
如:function.call(this,1,2,3);
10、如何獲取UA?
答:
function whatBrowser() {
document.Browser.Name.value=navigator.appName;
document.Browser.Version.value=navigator.appVersion;
document.Browser.Code.value=navigator.appCodeName;
document.Browser.Agent.value=navigator.userAgent;
}
11、哪些常見操作會造成內(nèi)存泄漏?
答:
內(nèi)存泄漏指任何對象在您不再擁有或需要它之后仍然存在。
垃圾回收器定期掃描對象,并計算引用了每個對象的其他對象的數(shù)量。如果一個對象的引用數(shù)量為 0(沒有其他對象引用過該對象),或?qū)υ搶ο蟮奈┮灰檬茄h(huán)的,那么該對象的內(nèi)存即可回收。
setTimeout 的第一個參數(shù)使用字符串而非函數(shù)的話,會引發(fā)內(nèi)存泄漏。
閉包、控制臺日志、循環(huán)(在兩個對象彼此引用且彼此保留時,就會產(chǎn)生一個循環(huán))。
12、線程與進程的區(qū)別
答:
一個程序至少有一個進程,一個進程至少有一個線程。
線程的劃分尺度小于進程,使得多線程程序的并發(fā)性高。
另外,進程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運行效率。
線程在執(zhí)行過程中與進程還是有區(qū)別的。每個獨立的線程有一個程序運行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨立執(zhí)行,必須依存在應用程序中,由應用程序提供多個線程執(zhí)行控制。
從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執(zhí)行部分可以同時執(zhí)行。但操作系統(tǒng)并沒有將多個線程看做多個獨立的應用,來實現(xiàn)進程的調(diào)度和管理以及資源分配。這就是進程和線程的重要區(qū)別。
13、如何解決跨域問題
JSONP:
原理是:動態(tài)插入script標簽,通過script標簽引入一個js文件,這個js文件載入成功后會執(zhí)行我們在url參數(shù)中指定的函數(shù),并且會把我們需要的json數(shù)據(jù)作為參數(shù)傳入。
由于同源策略的限制,XmlHttpRequest只允許請求當前源(域名、協(xié)議、端口)的資源,為了實現(xiàn)跨域請求,可以通過script標簽實現(xiàn)跨域請求,然后在服務端輸出JSON數(shù)據(jù)并執(zhí)行回調(diào)函數(shù),從而解決了跨域的數(shù)據(jù)請求。
優(yōu)點是兼容性好,簡單易用,支持瀏覽器與服務器雙向通信。缺點是只支持GET請求。
JSONP:json+padding(內(nèi)填充),顧名思義,就是把JSON填充到一個盒子里
16、ES6的了解
新增模板字符串(為JavaScript提供了簡單的字符串插值功能)、箭頭函數(shù)(操作符左邊為輸入的參數(shù),而右邊則是進行的操作以及返回的值Inputs=>outputs。)、for-of(用來遍歷數(shù)據(jù)—例如數(shù)組中的值。)arguments對象可被不定參數(shù)和默認參數(shù)完美代替。ES6將promise對象納入規(guī)范,提供了原生的Promise對象。增加了let和const命令,用來聲明變量。增加了塊級作用域。let命令實際上就增加了塊級作用域。ES6規(guī)定,var命令和function命令聲明的全局變量,屬于全局對象的屬性;let命令、const命令、class命令聲明的全局變量,不屬于全局對象的屬性。。還有就是引入module模塊的概念。
17、用過哪些設(shè)計模式?
(1)工廠模式:
主要好處就是可以消除對象間的耦合,通過使用工程方法而不是new關(guān)鍵字。將所有實例化的代碼集中在一個位置防止代碼重復。
(2)工廠模式解決了重復實例化的問題 ,但還有一個問題,那就是識別問題,因為根本無法 搞清楚他們到底是哪個對象的實例。
(3)構(gòu)造函數(shù)模式
使用構(gòu)造函數(shù)的方法 ,即解決了重復實例化的問題 ,又解決了對象識別的問題,該模式與工廠模式的不同之處在于:
構(gòu)造函數(shù)方法沒有顯示的創(chuàng)建對象 (new Object());
直接將屬性和方法賦值給 this 對象;
沒有 renturn 語句。
(4)原型鏈模式
(5)構(gòu)造和原型鏈的組合模式
18、說說你對閉包的理解
使用閉包主要是為了設(shè)計私有的方法和變量。閉包的優(yōu)點是可以避免全局變量的污染,缺點是閉包會常駐內(nèi)存,會增大內(nèi)存使用量,使用不當很容易造成內(nèi)存泄露。在js中,函數(shù)即閉包,只有函數(shù)才會產(chǎn)生作用域的概念
閉包有三個特性:
(1)函數(shù)嵌套函數(shù)
(2)函數(shù)內(nèi)部可以引用外部的參數(shù)和變量
(3)參數(shù)和變量不會被垃圾回收機制回收
19、請你談談Cookie的弊端
cookie雖然在持久保存客戶端數(shù)據(jù)提供了方便,分擔了服務器存儲的負擔,但還是有很多局限性的。
第一:每個特定的域名下最多生成20個cookie
(1)IE6或更低版本最多20個cookie
(2)IE7和之后的版本最后可以有50個cookie。
(3)Firefox最多50個cookie
(4)chrome和Safari沒有做硬性限制
IE和Opera 會清理近期最少使用的cookie,F(xiàn)irefox會隨機清理cookie。
cookie的最大大約為4096字節(jié),為了兼容性,一般不能超過4095字節(jié)。
IE 提供了一種存儲可以持久化用戶數(shù)據(jù),叫做userdata,從IE5.0就開始支持。每個數(shù)據(jù)最多128K,每個域名下最多1M。這個持久化數(shù)據(jù)放在緩存中,如果緩存沒有清理,那么會一直存在。
優(yōu)點:極高的擴展性和可用性
通過良好的編程,控制保存在cookie中的session對象的大小。
通過加密和安全傳輸技術(shù)(SSL),減少cookie被破解的可能性。
只在cookie中存放不敏感數(shù)據(jù),即使被盜也不會有重大損失。
控制cookie的生命期,使之不會永遠有效。偷盜者很可能拿到一個過期的cookie。
缺點:
Cookie數(shù)量和長度的限制。每個domain最多只能有20條cookie,每個cookie長度不能超過4KB,否則會被截掉.
安全性問題。如果cookie被人攔截了,那人就可以取得所有的session信息。即使加密也與事無補,因為攔截者并不需要知道cookie的意義,他只要原樣轉(zhuǎn)發(fā)cookie就可以達到目的了。
有些狀態(tài)不可能保存在客戶端。例如,為了防止重復提交表單,我們需要在服務器端保存一個計數(shù)器。如果我們把這個計數(shù)器保存在客戶端,那么它起不到任何作用。
20、瀏覽器本地存儲
在較高版本的瀏覽器中,js提供了sessionStorage和globalStorage。在HTML5中提供了localStorage來取代globalStorage。
html5中的Web Storage包括了兩種存儲方式:sessionStorage和localStorage。
sessionStorage用于本地存儲一個會話(session)中的數(shù)據(jù),這些數(shù)據(jù)只有在同一個會話中的頁面才能訪問并且當會話結(jié)束后數(shù)據(jù)也隨之銷毀。因此sessionStorage不是一種持久化的本地存儲,僅僅是會話級別的存儲。
而localStorage用于持久化的本地存儲,除非主動刪除數(shù)據(jù),否則數(shù)據(jù)是永遠不會過期的。
web storage和cookie的區(qū)別
Web Storage的概念和cookie相似,區(qū)別是它是為了更大容量存儲設(shè)計的。Cookie的大小是受限的,并且每次你請求一個新的頁面的時候Cookie都會被發(fā)送過去,這樣無形中浪費了帶寬,另外cookie還需要指定作用域,不可以跨域調(diào)用。
除此之外,Web Storage擁有setItem,getItem,removeItem,clear等方法,不像cookie需要前端開發(fā)者自己封裝setCookie,getCookie。
但是cookie也是不可以或缺的:cookie的作用是與服務器進行交互,作為HTTP規(guī)范的一部分而存在 ,而Web Storage僅僅是為了在本地“存儲”數(shù)據(jù)而生
瀏覽器的支持除了IE7及以下不支持外,其他標準瀏覽器都完全支持(ie及FF需在web服務器里運行),值得一提的是IE總是辦好事,例如IE7、IE6中的userData其實就是javascript本地存儲的解決方案。通過簡單的代碼封裝可以統(tǒng)一到所有的瀏覽器都支持web storage。
localStorage和sessionStorage都具有相同的操作方法,例如setItem、getItem和removeItem等
21、cookie 和session 的區(qū)別:
(1)cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務器上。
(2)cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙考慮到安全應當使用session。
(3)session會在一定時間內(nèi)保存在服務器上。當訪問增多,會比較占用你服務器的性能
考慮到減輕服務器性能方面,應當使用COOKIE。
(4)單個cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
(5)所以個人建議:
將登陸信息等重要信息存放為SESSION
其他信息如果需要保留,可以放在COOKIE中
22、如何實現(xiàn)瀏覽器內(nèi)多個標簽頁之間的通信?
調(diào)用localstorge、cookies等本地存儲方式
23、js延遲加載的方式有哪些?
defer和async、動態(tài)創(chuàng)建DOM方式(創(chuàng)建script,插入到DOM中,加載完畢后callBack)、按需異步載入js。
24、列舉IE 與其他瀏覽器不一樣的特性?
(1)IE支持currentStyle,F(xiàn)Irefox使用getComputStyle
(2)IE 使用innerText,F(xiàn)irefox使用textContent
(3)濾鏡方面:IE:filter:alpha(opacity= num);Firefox:-moz-opacity:num
(4)事件方面:IE:attachEvent:火狐是addEventListener
(5)鼠標位置:IE是event.clientX;火狐是event.pageX
(6)IE使用event.srcElement;Firefox使用event.target
(7)IE中消除list的原點僅需margin:0即可達到最終效果;FIrefox需要設(shè)置margin:0;padding:0以及l(fā)ist-style:none
(8)CSS圓角:ie7以下不支持圓角
25、javascript對象的幾種創(chuàng)建方式
(1)工廠模式
(2)構(gòu)造函數(shù)模式
(3)原型模式
(4)混合構(gòu)造函數(shù)和原型模式
(5)動態(tài)原型模式
(6)寄生構(gòu)造函數(shù)模式
(7)穩(wěn)妥構(gòu)造函數(shù)模式