1.js的幾種數(shù)據(jù)類型?
字符串、數(shù)字、布爾、對(duì)象、Null、Undefined
2.typeof下的類型都有什么?
string、number、boolean、function、object、Undefined
3.js的常見內(nèi)置對(duì)象類?
Date,Array,Math、Number、Boolean、String、Array、RegExp、Function...
3.js的常見內(nèi)置對(duì)象類?
Date,Array,Math、Number、Boolean、String、Array、RegExp、Function...

4.創(chuàng)建一個(gè)對(duì)象
function Person(name, age) {
this.name = name;
this.age = age;
this.sing = function() { alert(this.name) }
}
5.談?wù)凾his對(duì)象的理解。
this是js的一個(gè)關(guān)鍵字,隨著函數(shù)使用場(chǎng)合不同,this的值會(huì)發(fā)生變化。
但是總有一個(gè)原則,那就是this指的是調(diào)用函數(shù)的那個(gè)對(duì)象。
this一般情況下是全局對(duì)象Global。 作為方法調(diào)用,那么this就是指這個(gè)對(duì)象
6.十六進(jìn)制與RGB值轉(zhuǎn)化?
十六進(jìn)制轉(zhuǎn)化成RGB
# A9 D3 5E
R:A9=916^0+1016^1=169
G:D3=316^0+1316^1=211
B:5E=1416^0+516^1=94
rgb(169,211,94)
RGB轉(zhuǎn)化成十六進(jìn)制
169/16=10余9 A9
211/16=13余3 D3
94/16=5余14 5E
#A9D35E
7.null和undefined的區(qū)別?
null和undefined都表示沒有內(nèi)容,是空值,null是數(shù)值類型當(dāng)中最小的,可以和其他數(shù)值進(jìn)行轉(zhuǎn)化,它的類型屬于object,而undefined不可以進(jìn)行轉(zhuǎn)化,一般用作語義提示,表示控制,屬于undefined類型
8.前++和后++的區(qū)別?
++表示本身變量自行加1,前++是先自身加1,再執(zhí)行其他運(yùn)算;后++是先執(zhí)行其他運(yùn)算,后自身加1
9.while和do-while的區(qū)別
while是先判斷條件是否滿足,在執(zhí)行循環(huán)語句;do-while是先執(zhí)行語句,再判斷條件;條件不滿足情況下,do-while比while多走一次
10.結(jié)束語句的區(qū)別
break:結(jié)束所有循環(huán),當(dāng)多層循環(huán)時(shí),可以指定跳出某層循環(huán)
continue:結(jié)束當(dāng)前循環(huán)
return 跳出函數(shù)體,如果函數(shù)里有多層循環(huán),會(huì)跳出所有循環(huán),并且返回值給調(diào)用者
11.什么是變量的作用域
全局變量:是定義在方法體外面,可以再任何表達(dá)式或函數(shù)里使用,在頂層代碼中我們使用this關(guān)鍵字和window對(duì)象都可以訪問到它
局部變量:是定義在方法體里,只能在當(dāng)前函數(shù)里使用,函數(shù)執(zhí)行完畢時(shí)局部變量即刻銷毀
JS變量沒有塊級(jí)作用域,函數(shù)中的變量在整個(gè)函數(shù)都中有效
基本數(shù)據(jù)類型:定義簡(jiǎn)單的數(shù)據(jù)字段
引用數(shù)據(jù)類型:可以定義多個(gè)值,或者包含屬性和方法
12.js的垃圾回收機(jī)制?
js具有自動(dòng)回收垃圾的機(jī)制,不用程序員手動(dòng)調(diào)用,而c或c++需要自己回收,js的垃圾回收機(jī)制有固定的時(shí)間間隔和周期。引用數(shù)據(jù)類型沒有固定大小,例如,定義數(shù)組時(shí),當(dāng)程序知道已知大小時(shí),才在內(nèi)存中分配空間,如果初始沒給大小,則定義值時(shí)才分配空間。局部變量只在函數(shù)運(yùn)行過程中存在,但是全局變量在頁面加載時(shí)就已經(jīng)存在了,并且全局變量會(huì)在頁面關(guān)閉時(shí)才回收。
手動(dòng)回收,例如:var x=new Number();
x=null;//清空內(nèi)存
13.函數(shù)聲明和匿名函數(shù)的區(qū)別?
函數(shù)聲明:又叫做函數(shù)表達(dá)式,函數(shù)聲明要定義函數(shù)名稱,并且通過標(biāo)簽里的事件進(jìn)行調(diào)用,函數(shù)聲明被調(diào)用時(shí)才會(huì)存在,用過之后會(huì)在內(nèi)存中清空
匿名函數(shù):屬于閉包的一種,不用定義函數(shù)名稱,更體現(xiàn)了頁面的表現(xiàn)與結(jié)構(gòu)相分離,匿名函數(shù)在頁面加載時(shí)就存在,在頁面關(guān)閉時(shí)進(jìn)行清空。用匿名函數(shù)可以更好的封裝js
14.解釋一下閉包?
是指有權(quán)訪問另一個(gè)函數(shù)的作用域中的變量的函數(shù)
優(yōu)點(diǎn):在頁面加載時(shí)在內(nèi)存中存在,調(diào)用速度快,并閉包的變量也會(huì)始終保存在內(nèi)存中
缺點(diǎn):造成內(nèi)存消耗過大,頁面性能降低,需要手動(dòng)清空才能釋放內(nèi)存
閉包的表現(xiàn)形式:函數(shù)的嵌套,遞歸,匿名函數(shù)等。
15.new操作符具體干了什么呢?
1、創(chuàng)建一個(gè)空對(duì)象,并且 this 變量引用該對(duì)象,同時(shí)還繼承了該函數(shù)的原型。
2、屬性和方法被加入到 this 引用的對(duì)象中。
3、新創(chuàng)建的對(duì)象由 this 所引用,并且最后隱式的返回 this 。
16.如何判斷一個(gè)對(duì)象是否屬于某個(gè)類?
使用instanceof (待完善)
if(a instanceof Person){
alert('yes');
}
17.模塊化怎么做?
[立即執(zhí)行函數(shù)]不暴露私有成員
var module1 = (function(){
var _count = 0;
var m1 = function(){
//...
};
var m2 = function(){
//...
};
return {
m1 : m1,
m2 : m2
};
})();
18.繼承有幾種方法?
1、原型鏈繼承
function Cat(){
}
Cat.prototype = new Animal();
Cat.prototype.name = 'cat';
2、構(gòu)造繼承
function Cat(name){
Animal.call(this);
this.name = name ;
}
3.組合繼承
function SuperType(name) {
this.name = name;
this.colors = ["red","blue","green"];
}
SuperType.prototype.sayName = function() {
console.log(this.name); }
function SubType(name, age) {
SuperType.call(this,name);//繼承屬性
this.age = age;
}
4.原型式繼承
function object(o) {
function F(){}
F.prototype = o;
return new F();
}
5.寄生式繼承
function createAnother(original) {
var clone = object(original);
clone.sayHi = function () { alert("hi"); };
return clone;
}
var person = {
name:"EvanChen";
};
var anotherPerson = createAnother(person);
anotherPerson.sayHi();
6.寄生組合式繼承
function inheritProperty(subType, superType) {
var prototype = object(superType.prototype);//創(chuàng)建對(duì)象
prototype.constructor = subType;//增強(qiáng)對(duì)象
subType.prototype = prototype;//指定對(duì)象
}
19.什么是原型鏈?
原型鏈:作為繼承的主要方法,用一個(gè)引用類型的原型,調(diào)用原型里的屬性和方法,實(shí)現(xiàn)子類繼承父類進(jìn)行調(diào)用,每一個(gè)原型對(duì)象包含一個(gè)指向構(gòu)造器的指針,通過指針孩子可以找到父類里屬性和方法,那么prototype就是這個(gè)指針,當(dāng)指向父類,在內(nèi)存中就構(gòu)成了一個(gè)原型鏈。
20.怎么提高節(jié)點(diǎn)操作性能?
文檔碎片相當(dāng)于一個(gè)口袋,用來提高DOM的操作性能,使操作節(jié)點(diǎn)的速度更快。
var frag=document.createDocumentFragment();//創(chuàng)建口袋
frag.appendChild(l);//往口袋放對(duì)象
對(duì)象.appendChild(frag);//把口袋執(zhí)行
21事件、IE與火狐的事件機(jī)制有什么區(qū)別? 如何阻止冒泡?
- 我們?cè)诰W(wǎng)頁中的某個(gè)操作(有的操作對(duì)應(yīng)多個(gè)事件)。例如:當(dāng)我們點(diǎn)擊一個(gè)按鈕就會(huì)產(chǎn)生一個(gè)事件。是可以被 JavaScript 偵測(cè)到的行為。
- 事件處理機(jī)制:IE是事件冒泡、火狐是事件捕獲;
- 第一種:event.stopPropagation();
第二種:return false;
第三種:event.preventDefault();
第四種:event.cancelable=true; 只支持IE8以下瀏覽器
22.事件綁定用什么?
1.addEventListenter("事件名稱",調(diào)用函數(shù),true/false)
true表示捕獲事件false在冒泡階段調(diào)用(支持高版本)
2.attachEvent()綁定事件(IE8以下) IE低版本下只支持冒泡事件
23.js是單線程還是多線程
JS是單線程,同理js所有寫的框架也都是單線程。
js里有異步函數(shù)和延遲函數(shù),會(huì)在其他函數(shù)調(diào)用完成后執(zhí)行,所以這兩種函數(shù)在隊(duì)列末尾處加載
24.js的運(yùn)行機(jī)制
簡(jiǎn)單來說js有2種機(jī)制,一個(gè)是事件機(jī)制,一個(gè)是io機(jī)制。
事件機(jī)制是通過網(wǎng)頁標(biāo)簽所操作的事件流程,用來調(diào)用DOM和BOM對(duì)象的;io機(jī)制簡(jiǎn)單來說是處理文件的,例如:上傳下載,讀寫文件,操作數(shù)據(jù)庫等
25.瀏覽器存儲(chǔ)都有哪些?
cookie :cookie值是存在用戶電腦里,用來存儲(chǔ)文本框的值,窗體圖標(biāo)等一些小圖片,存在電腦磁盤下,所以刷新頁面不會(huì)被清空,它所存在瀏覽器相應(yīng)的文件夾里,由你訪問的頁面設(shè)置信息的保存周期,但是在頁面上顯示cookie值需要在服務(wù)器上設(shè)置js,一個(gè)cookie值最多只能存儲(chǔ)4kB,如果網(wǎng)絡(luò)連接不通,cookie也不會(huì)進(jìn)行顯示
sessionStorage:存儲(chǔ)數(shù)據(jù)在頁面關(guān)閉之后,數(shù)據(jù)會(huì)被刪除,信息存儲(chǔ)在本地磁盤下
localStorage:沒有時(shí)間限制,除非手動(dòng)刪除,一個(gè)本地存儲(chǔ)可多達(dá)5MB以上
26.告訴我答案是多少?
(function(x){
delete x;
alert(x);
})(1+5);
函數(shù)參數(shù)無法delete刪除,delete只能刪除通過for in訪問的屬性。
當(dāng)然,刪除失敗也不會(huì)報(bào)錯(cuò),所以代碼運(yùn)行會(huì)彈出“1”。
27.JS中的call()和apply()方法的區(qū)別?
call方法:
語法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定義:調(diào)用一個(gè)對(duì)象的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象。
說明: call 方法可以用來代替另一個(gè)對(duì)象調(diào)用一個(gè)方法。call 方法可將一個(gè)函數(shù)的對(duì)象上下文從初始的上下文改變?yōu)橛?thisObj 指定的新對(duì)象。 如果沒有提供 thisObj 參數(shù),那么 Global 對(duì)象被用作 thisObj。
apply方法:
語法:apply([thisObj[,argArray]])
定義:應(yīng)用某一對(duì)象的一個(gè)方法,用另一個(gè)對(duì)象替換當(dāng)前對(duì)象。
說明: 如果 argArray 不是一個(gè)有效的數(shù)組或者不是 arguments 對(duì)象,那么將導(dǎo)致一個(gè) TypeError。 如果沒有提供 argArray 和 thisObj 任何一個(gè)參數(shù),那么 Global 對(duì)象將被用作 thisObj, 并且無法被傳遞任何參數(shù)。
28.JSON 的了解
JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。它是基于JavaScript的一個(gè)子集。數(shù)據(jù)格式簡(jiǎn)單, 易于讀寫, 占用帶寬小
{'age':'12', 'name':'back'}
29.如何解決跨域問題?
1.通過動(dòng)態(tài)加載script標(biāo)簽
2.通過動(dòng)態(tài)生成iframe
document.domain + iframe
location.hash + iframe
window.name + iframe
3.postMessage html5 跨域技術(shù)
var ifr = document.getElementById('ifr');
var targetOrigin = 'http://b.com';
ifr.contentWindow.postMessage('I was there!', targetOrigin);
4.CORS 自定義http頭
var xdr = new XDomainRequest();
console.log(xdr.responseText);
5.JSONP 回調(diào)函數(shù)和json數(shù)據(jù)
script.src = 'http://www.baidu.com/json/?callback=handleResponse'; - web sockets html5 web通信技術(shù)
var socket = new WebSockt('ws://www.baidu.com');
30.http狀態(tài)碼有那些?分別代表是什么意思?
100-199 用于指定客戶端應(yīng)相應(yīng)的某些動(dòng)作。
200-299 用于表示請(qǐng)求成功。
300-399 用于已經(jīng)移動(dòng)的文件并且常被包含在定位頭信息中指定新的地址信息。
400-499 用于指出客戶端的錯(cuò)誤。400 1、語義有誤,當(dāng)前請(qǐng)求無法被服務(wù)器理解。
401 當(dāng)前請(qǐng)求需要用戶驗(yàn)證 403 服務(wù)器已經(jīng)理解請(qǐng)求,但是拒絕執(zhí)行它。
500-599 用于支持服務(wù)器錯(cuò)誤。 503 – 服務(wù)不可用
31.那些操作會(huì)造成內(nèi)存泄漏?
內(nèi)存泄漏指任何對(duì)象在您不再擁有或需要它之后仍然存在。
垃圾回收器定期掃描對(duì)象,并計(jì)算引用了每個(gè)對(duì)象的其他對(duì)象的數(shù)量。如果一個(gè)對(duì)象的引用數(shù)量為 0(沒有其他對(duì)象引用過該對(duì)象),或?qū)υ搶?duì)象的惟一引用是循環(huán)的,那么該對(duì)象的內(nèi)存即可回收。
setTimeout 的第一個(gè)參數(shù)使用字符串而非函數(shù)的話,會(huì)引發(fā)內(nèi)存泄漏。
閉包、控制臺(tái)日志、循環(huán)(在兩個(gè)對(duì)象彼此引用且彼此保留時(shí),就會(huì)產(chǎn)生一個(gè)循環(huán))
32.對(duì)Node的優(yōu)點(diǎn)和缺點(diǎn)提出了自己的看法:
(優(yōu)點(diǎn))因?yàn)镹ode是基于事件驅(qū)動(dòng)和無阻塞的,所以非常適合處理并發(fā)請(qǐng)求,
因此構(gòu)建在Node上的代理服務(wù)器相比其他技術(shù)實(shí)現(xiàn)(如Ruby)的服務(wù)器表現(xiàn)要好得多。
此外,與Node代理服務(wù)器交互的客戶端代碼是由javascript語言編寫的,
因此客戶端和服務(wù)器端都用同一種語言編寫,這是非常美妙的事情。
(缺點(diǎn))Node是一個(gè)相對(duì)新的開源項(xiàng)目,所以不太穩(wěn)定,它總是一直在變,
而且缺少足夠多的第三方庫支持。看起來,就像是Ruby/Rails當(dāng)年的樣子。
33.異步加載的方式
(1) defer,只支持IE
<script type="text/javascript" defer="defer">
alert(document.getElementById("p1").firstChild.nodeValue);
</script>
(2) async
var scriptEle = document.createElement("script");
scriptEle.async = true;
(3) XHR Injection(XHR 注入):通過XMLHttpRequest來獲取javascript,然后創(chuàng)建一個(gè)script元素插入到DOM結(jié)構(gòu)中。ajax請(qǐng)求成功后設(shè)置script.text為請(qǐng)求成功后返回的responseText。
34.ajax的缺點(diǎn)
1、ajax不支持瀏覽器back按鈕。
2、安全問題 AJAX暴露了與服務(wù)器交互的細(xì)節(jié)。
3、對(duì)搜索引擎的支持比較弱。
4、破壞了程序的異常機(jī)制。
5、不容易調(diào)試。
35.ajax是什么?ajax 的交互模型?同步和異步的區(qū)別?
1. 通過異步模式,提升了用戶體驗(yàn)
2. 優(yōu)化了瀏覽器和服務(wù)器之間的傳輸,減少不必要的數(shù)據(jù)往返,減少了帶寬占用
3. Ajax在客戶端運(yùn)行,承擔(dān)了一部分本來由服務(wù)器承擔(dān)的工作,減少了大用戶量下的服務(wù)器負(fù)載。
4.同步是一個(gè)進(jìn)程正在運(yùn)行,其他進(jìn)程必須等待該進(jìn)程執(zhí)行完之后才執(zhí)行,異步是線程并行加載互不影響。
36. Ajax的最大的特點(diǎn)是什么。
Ajax可以實(shí)現(xiàn)動(dòng)態(tài)不刷新(局部刷新)
readyState屬性 狀態(tài) 有5個(gè)可取值: 0=未初始化 ,1=正在加載 2=以加載,3=交互中,4=完成
37.在css/js代碼上線之后開發(fā)人員經(jīng)常會(huì)優(yōu)化性能,從用戶刷新網(wǎng)頁開始,一次js請(qǐng)求一般情況下有哪些地方會(huì)有緩存處理?
瀏覽器緩存,dns緩存,cdn緩存,服務(wù)器緩存
38.http請(qǐng)求頭有哪些?
Accept:瀏覽器可接受的MIME類型。
Accept-Charset:瀏覽器可接受的字符集。
Accept-Encoding:瀏覽器能夠進(jìn)行解碼的數(shù)據(jù)編碼方式,比如gzip。Servlet能夠向支持gzip的瀏覽器返回經(jīng)gzip編碼的HTML頁面。許多情形下這可以減少5到10倍的下載時(shí)間。
Accept-Language:瀏覽器所希望的語言種類,當(dāng)服務(wù)器能夠提供一種以上的語言版本時(shí)要用到。
Authorization:授權(quán)信息,通常出現(xiàn)在對(duì)服務(wù)器發(fā)送的WWW-Authenticate頭的應(yīng)答中。
Connection:表示是否需要持久連接。如果Servlet看到這里的值為“Keep-Alive”,或者看到請(qǐng)求使用的是HTTP 1.1(HTTP 1.1默認(rèn)進(jìn)行持久連接),它就可以利用持久連接的優(yōu)點(diǎn),當(dāng)頁面包含多個(gè)元素時(shí)(例如Applet,圖片),顯著地減少下載所需要的時(shí)間。要實(shí)現(xiàn)這一點(diǎn),Servlet需要在應(yīng)答中發(fā)送一個(gè)Content-Length頭,最簡(jiǎn)單的實(shí)現(xiàn)方法是:先把內(nèi)容寫入ByteArrayOutputStream,然后在正式寫出內(nèi)容之前計(jì)算它的大小。
Content-Length:表示請(qǐng)求消息正文的長(zhǎng)度。
Cookie:這是最重要的請(qǐng)求頭信息之一
From:請(qǐng)求發(fā)送者的email地址,由一些特殊的Web客戶程序使用,瀏覽器不會(huì)用到它。
Host:初始URL中的主機(jī)和端口。
If-Modified-Since:只有當(dāng)所請(qǐng)求的內(nèi)容在指定的日期之后又經(jīng)過修改才返回它,否則返回304“Not Modified”應(yīng)答。
Pragma:指定“no-cache”值表示服務(wù)器必須返回一個(gè)刷新后的文檔,即使它是代理服務(wù)器而且已經(jīng)有了頁面的本地拷貝。
Referer:包含一個(gè)URL,用戶從該URL代表的頁面出發(fā)訪問當(dāng)前請(qǐng)求的頁面。
User-Agent:瀏覽器類型,如果Servlet返回的內(nèi)容與瀏覽器類型有關(guān)則該值非常有用。
UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE瀏覽器所發(fā)送的非標(biāo)準(zhǔn)的請(qǐng)求頭,表示屏幕大小、顏色深度、操作系統(tǒng)和CPU類型。cf43c1ed9efa87f1fd56860af8a13b5f.jpeg
