題目1: 下面的代碼輸出多少珊随?修改代碼讓 fnArri 輸出 i蔗彤。使用 兩種以上的方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return fnArr.index;
};
}
console.log( fnArr[3]() ); //10
方法一:
var fnArr = [];
for (var i = 0; i < 10; i ++) {
(function(i){
fnArr[i] = function(){
return i;
}
})(i);
}
console.log( fnArr[3]() ); //3
方法二:
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = (function(i){ //IIFE & 閉包
return function(){
return i;
}
})(i);
}
console.log( fnArr[3]() ); //3
方法三:
var fnArr = [];
for (let i = 0; i < 10; i ++) { //使用ES6: let
fnArr[i] = function(){
return i;
};
}
console.log( fnArr[3]() );
題目2: 封裝一個(gè)汽車對(duì)象孝扛,可以通過如下方式獲取汽車狀態(tài)
var Car = (function(){
var speed = 0;
function setSpeed(s){
speed = s;
}
function getSpeed(){
console.log(speed) ;
}
function accelerate(){
speed+=10;
}
function decelerate(){
if(speed>10){
speed-=10;
}else {
speed = 0;
}
}
function getStatus(){
if(speed>0){
console.log( "running");
}else{
console.log("stop") ;
}
}
return {
setSpeed: setSpeed,
getSpeed:getSpeed,
accelerate:accelerate,
decelerate:decelerate,
getStatus:getStatus
}
})()
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.getStatus(); //'stop'
Car.speed; //error
題目3:下面這段代碼輸出結(jié)果是? 為什么?
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);
輸出1 3 2舀锨,那是因?yàn)閟etTimeout函數(shù)的運(yùn)行機(jī)制是,將制定的代碼移出本次執(zhí)行沪编,等到下一輪EventLoop時(shí)呼盆,再檢查時(shí)間,執(zhí)行代碼蚁廓。這意味著访圃,先console.log(1),再console.log(3)相嵌,本次代碼執(zhí)行完后再檢查時(shí)間腿时,執(zhí)行console.log(2)
題目4:下面這段代碼輸出結(jié)果是? 為什么?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
瀏覽器會(huì)陷入while死循環(huán)。因?yàn)閟etTimeout函數(shù)的運(yùn)行機(jī)制是饭宾,將制定的代碼移出本次執(zhí)行批糟,等到下一輪EventLoop時(shí),再檢查時(shí)間看铆,執(zhí)行代碼徽鼎。所以,while循環(huán)將一直循環(huán)下去弹惦,本次EventLoop無法結(jié)束否淤,無法進(jìn)入setTimeout。
題目5: 下面這段代碼輸出肤频?如何輸出delayer: 0, delayer:1...(使用閉包來實(shí)現(xiàn))
for(var i=0;i<5;i++){
setTimeout(function(i){
console.log('delayer:' + i );
}, 0);
console.log(i);
}
修改后:
for(var i=0;i<5;i++){
!function(i){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
}(i)
}
題目6: 如何獲取元素的真實(shí)寬高
function getCss(curEle,attr){
return window.getComputedStyle ? window.getComputedStyle(curEle,null)[attr] : curEle.currentStyle[attr];
}
getCss(ele,'width')//寬度
getCss(ele,'height')//高度
題目7: URL 如何編碼解碼叹括?為什么要編碼?
編碼原因:
- Url參數(shù)字符串中使用key=value鍵值對(duì)這樣的形式來傳參宵荒,鍵值對(duì)之間以&符號(hào)分隔汁雷,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&报咳,那么勢(shì)必會(huì)造成接收Url的服務(wù)器解析錯(cuò)誤侠讯,因此必須將引起歧義的&和=符號(hào)進(jìn)行轉(zhuǎn)義,也就是對(duì)其進(jìn)行編碼暑刃。
- Url的編碼格式采用的是ASCII碼厢漩,而不是Unicode,這也就是說你不能在Url中包含任何非ASCII字符岩臣,例如中文溜嗜。否則如果客戶端瀏覽器和服務(wù)端瀏覽器支持的字符集不同的情況下,中文可能會(huì)造成問題架谎。
ps:URI是統(tǒng)一資源標(biāo)識(shí)的意思炸宵,通常我們所說的URL只是URI的一種。典型URL的格式如下所示谷扣。下面提到的URL編碼土全,實(shí)際上應(yīng)該指的是URI編碼。
Url編碼的原則就是使用安全的字符(沒有特殊用途或者特殊意義的可打印字符)去表示那些不安全的字符。
解決辦法:
三個(gè)編碼的函數(shù)——escape裹匙,encodeURI瑞凑,encodeURIComponent——都是用于將不安全不合法的Url字符轉(zhuǎn)換為合法的Url字符表示,它們有以下幾個(gè)不同點(diǎn)概页。
安全字符不同:
下面列出了這三個(gè)函數(shù)的安全字符(即函數(shù)不會(huì)對(duì)這些字符進(jìn)行編碼)
- escape(69個(gè)):*/@+-._0-9a-zA-Z
- encodeURI(82個(gè)):!#$&'()*+,/:;=?@-._~0-9a-zA-Z
- encodeURIComponent(71個(gè)):!'()*-._~0-9a-zA-Z
兼容性不同:escape函數(shù)是從Javascript 1.0的時(shí)候就存在了籽御,其他兩個(gè)函數(shù)是在Javascript 1.5才引入的。但是由于Javascript 1.5已經(jīng)非常普及了绰沥,所以實(shí)際上使用encodeURI和encodeURIComponent并不會(huì)有什么兼容性問題篱蝇。
對(duì)Unicode字符的編碼方式不同:這三個(gè)函數(shù)對(duì)于ASCII字符的編碼方式相同,均是使用百分號(hào)+兩位十六進(jìn)制字符來表示徽曲。但是對(duì)于Unicode字符零截,escape的編碼方式是%uxxxx,其中的xxxx是用來表示unicode字符的4位十六進(jìn)制字符秃臣。這種方式已經(jīng)被W3C廢棄了涧衙。但是在ECMA-262標(biāo)準(zhǔn)中仍然保留著escape的這種編碼語法。encodeURI和encodeURIComponent則使用UTF-8對(duì)非ASCII字符進(jìn)行編碼奥此,然后再進(jìn)行百分號(hào)編碼弧哎。這是RFC推薦的。因此建議盡可能的使用這兩個(gè)函數(shù)替代escape進(jìn)行編碼稚虎。
適用場(chǎng)合不同:encodeURI被用作對(duì)一個(gè)完整的URI進(jìn)行編碼撤嫩,而encodeURIComponent被用作對(duì)URI的一個(gè)組件進(jìn)行編碼。從上面提到的安全字符范圍表格來看蠢终,我們會(huì)發(fā)現(xiàn)序攘,encodeURIComponent編碼的字符范圍要比encodeURI的大。我們上面提到過寻拂,保留字符一般是用來分隔URI組件(一個(gè)URI可以被切割成多個(gè)組件程奠,參考預(yù)備知識(shí)一節(jié))或者子組件(如URI中查詢參數(shù)的分隔符),如:號(hào)用于分隔scheme和主機(jī)祭钉,?號(hào)用于分隔主機(jī)和路徑瞄沙。由于encodeURI操縱的對(duì)象是一個(gè)完整的的URI,這些字符在URI中本來就有特殊用途慌核,因此這些保留字符不會(huì)被encodeURI編碼距境,否則意義就變了。
題目8: 補(bǔ)全如下函數(shù)垮卓,判斷用戶的瀏覽器類型
function isAndroid(){
return /android/i.test(navigator.userAgent);
}
function isIphone(){
return /iphone/i.test(navigator.userAgent);
}
function isIpad(){
return /ipad/i.test(navigator.userAgent);
}
function isIOS(){
return /iphone|ipad/i.test(navigator.userAgent);
}