題目1: 下面的代碼輸出多少?修改代碼讓 fnArri 輸出 i。使用 兩種以上的方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr[3]() ); //
輸出:10
方法1創(chuàng)建立即執(zhí)行函數(shù)
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] =(function(i){
return function(){
return i
}
})(i)
}
console.log( fnArr[3]()); //3
方法2
var fnArr=[];
for(var i=0;i<10;i++){
(function(n){
fnArr[i]=function(){
return n;
}
})(i)
}
console.log(fnArr[3]());
題目2: 封裝一個(gè)汽車對(duì)象,可以通過如下方式獲取汽車狀態(tài)
var Car = (function(){
var Car={
speed:0,
setSpeed:function(s){
Car.speed=s;
},
getSpeed:function(){
console.log(Car.speed)
return Car.speed;
},
accelerate:function(){
Car.speed+=10;
},
decelerate:function(){
Car.speed-=10;
if(Car.speed<0){
Car.speed='eror'
}
},
getStatus:function(){
if(Car.speed>0){
console.log('running')
return 'running'
}else{
Car.speed='eror'
console.log('stop')
return 'stop'
}
}
};
return Car;
})()
Car.setSpeed(30);
Car.getSpeed(); //30
Car.accelerate();
Car.getSpeed(); //40;
Car.decelerate();
Car.decelerate();
Car.getSpeed(); //20
Car.getStatus(); // 'running';
Car.decelerate();
Car.decelerate();
Car.decelerate();
Car.decelerate();
Car.getStatus(); //'stop';
console.log(Car.speed);
題目3:下面這段代碼輸出結(jié)果是? 為什么?
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);
//輸出的結(jié)果為 1 3 2
setTimeout()是在頁(yè)面加載完瀏覽器再執(zhí)行的
所以setTimeout()的執(zhí)行結(jié)果在最后;
頁(yè)面開始加載,首先var a=1,下面再var a相當(dāng)于執(zhí)行了一行代碼內(nèi)容為a,所以a的值還是1,這時(shí)console.log(a)為1
往下執(zhí)行,a=3,所以console.log(a) 3
題目4:下面這段代碼輸出結(jié)果是? 為什么?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
啥都不輸出,網(wǎng)頁(yè)會(huì)崩潰
因?yàn)?br>
setTimeout(function(){
flag = false;
},0)是在頁(yè)面加載其它代碼加載執(zhí)行完再執(zhí)行的,
所以flag=true,while(flag){}會(huì)一直循環(huán),知道把所有的內(nèi)存都占用,然后網(wǎng)頁(yè)崩潰
題目5: 下面這段代碼輸出?如何輸出delayer: 0, delayer:1...(使用閉包來實(shí)現(xiàn))
for(var i=0;i<5;i++){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
console.log(i);
}
輸出的結(jié)果為 :0 1 2 3 4
delayer:5
delayer:5
delayer:5
delayer:5
delayer:5
如何輸出delayer: 0, delayer:1...(使用閉包來實(shí)現(xiàn)):
for(var i=0;i<5;i++){
(function(i){
function fn(){
console.log('delayer:' + i );
}
setTimeout(fn, 0);
console.log(i);
})(i)
}
題目6: 如何獲取元素的真實(shí)寬高
getComputedStyle是一個(gè)可以獲取當(dāng)前元素所有最終使用的CSS屬性值。返回的是一個(gè)CSS樣式聲明對(duì)象。獲得的style是頁(yè)面上css計(jì)算的最終結(jié)果,其中這個(gè)聲明對(duì)象包含height和width屬性,可以通過下面的方式獲得真實(shí)樣式,這個(gè)方法第二個(gè)參數(shù)代表偽類沒有則為null;
//window.getComputedStyle("元素", "偽類");
console.log(window.getComputedStyle(d1,null).width)
console.log(window.getComputedStyle(d1,null).height)
題目7: URL 如何編碼解碼?為什么要編碼?
可用encodeURI()、encodeURIComponent()方法對(duì)url進(jìn)行編碼
encodeURI方法不會(huì)對(duì)下列字符編碼
ASCII字母
數(shù)字
~!@#$&*()=:/,;?+'
encodeURIComponent方法不會(huì)對(duì)下列字符編碼
ASCII字母
數(shù)字
~!*()'
所以encodeURIComponent比encodeURI編碼的范圍更大
解碼
用decodeURI()和decodeURIComponent()可以對(duì)編碼過的字符串進(jìn)行解碼
為什么要編碼?
我們都知道Http協(xié)議中參數(shù)的傳輸是"key=value"這種簡(jiǎn)直對(duì)形式的,如果要傳多個(gè)參數(shù)就需要用“&”符號(hào)對(duì)鍵值對(duì)進(jìn)行分割。如"?name1=value1&name2=value2",這樣在服務(wù)端在收到這種字符串的時(shí)候,會(huì)用“&”分割出每一個(gè)參數(shù),然后再用“=”來分割出參數(shù)值。
針對(duì)“name1=value1&name2=value2”我們來說一下客戶端到服務(wù)端的概念上解析過程:
上述字符串在計(jì)算機(jī)中用ASCII嗎表示為:
6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532。
6E616D6531:name1
3D:=
76616C756531:value1
26:&
6E616D6532:name2
3D:=
76616C756532:value2
服務(wù)端在接收到該數(shù)據(jù)后就可以遍歷該字節(jié)流,首先一個(gè)字節(jié)一個(gè)字節(jié)的吃,當(dāng)吃到3D這字節(jié)后,服務(wù)端就知道前面吃得字節(jié)表示一個(gè)key,再想后吃,如果遇到26,說明從剛才吃的3D到26子節(jié)之間的是上一個(gè)key的value,以此類推就可以解析出客戶端傳過來的參數(shù)。
現(xiàn)在有這樣一個(gè)問題,如果我的參數(shù)值中就包含=或&這種特殊字符的時(shí)候該怎么辦。
比如說“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么實(shí)際在傳輸過程中就會(huì)變成這樣“name1=va&lu=e1”。我們的本意是就只有一個(gè)鍵值對(duì),但是服務(wù)端會(huì)解析成兩個(gè)鍵值對(duì),這樣就產(chǎn)生了歧義。
還有就是中文等其他非英文字符也無法出現(xiàn)在url上所以要進(jìn)行編碼
題目8: 補(bǔ)全如下函數(shù),判斷用戶的瀏覽器類型
var a=window.navigator.userAgent
function isAndroid(){
var reg=/Android/ig
if(reg.test(a)){
return '安卓'
}
}
funcnction isIphone(){
var reg=/iphone/ig
if(reg.test(a)){
return 'ipone'
}
}
function isIpad(){
var reg=/ipad/ig
if(reg.test(a)){
return 'ipad'
}
}
function isIOS(){
var reg=/ios/ig
if(reg.test(a)){
return 'ios'
}
}