題目1: 下面的代碼輸出多少?修改代碼讓 fnArr[i]() 輸出 i。使用 兩種以上的方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
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 fn1(i){
function fn2(){
return i
}
return fn2;
}(i);
}
console.log( fnArr[3]() ); // 輸出 3
題目2: 封裝一個汽車對象,可以通過如下方式獲取汽車狀態
var Car = (function(){
var speed = 0;
function setSpeed(s){
speed = s
}
function getSpeed(){
console.log(speed);
return speed;
}
function accelerate(){
speed += 10;
}
function decelerate(){
speed -= 10;
speed = Math.max(0,speed);
}
function getStatus(){
if (speed) {
console.log('running');
} else {
console.log('stop');
}
}
return {
setSpeed: setSpeed,
getSpeed: getSpeed,
accelerate: accelerate,
decelerate: decelerate,
getStatus: getStatus,
speed:"error"
}
})()
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:下面這段代碼輸出結果是? 為什么?
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);
輸出
1
3
2
因為 setTimeout
運行機制是,將指定的代碼移出本次執行,等到下一輪Event Loop時,再檢查是否到了指定時間。如果到了,就執行對應的代碼;如果不到,就等到再下一輪Event Loop時重新判斷。這意味著,setTimeout
指定的代碼,必須等到本次執行的所有代碼都執行完,才會執行。
所以a的賦值順序為1,3,2
題目4:下面這段代碼輸出結果是? 為什么?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
無輸出
因為一直持續while循環,不會跳出
題目5: 下面這段代碼輸出?如何輸出delayer: 0, delayer:1...(使用閉包來實現)
for(var i=0;i<5;i++){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
console.log(i);
}
輸出
0
1
2
3
4
delayer:5
delayer:5
delayer:5
delayer:5
delayer:5
// 修改
for(var i=0;i<5;i++){
function outFun(i){
function fun(){
console.log('delayer:' + i );
}
return fun
}
setTimeout(outFun(i), 0);
}
題目6: 如何獲取元素的真實寬高
function getCss(e,attr){
return (e.currentStyle ? e.currentStyle : window.getComputedStyle(e,null))[attr]
}
var e = document.querySelector('.test');
console.log(getCss(e,'height'));
console.log(getCss(e,'width'));
題目7: URL 如何編碼解碼?為什么要編碼?
- URL 如何編碼解碼
JavaScript提供四個URL的編碼/解碼方法。
- decodeURI()
- decodeURIComponent()
- encodeURI()
4encodeURIComponent()
區別
encodeURI方法不會對下列字符編碼
ASCII字母
數字
~!@#$&*()=:/,;?+'
encodeURIComponent方法不會對下列字符編碼
ASCII字母
數字
~!*()'
所以encodeURIComponent比encodeURI編碼的范圍更大。
實際例子來說,encodeURIComponent會把 http://
編碼成 http%3A%2F%2F
而encodeURI卻不會。
如果你需要編碼整個URL,然后需要使用這個URL,那么用encodeURI。
encodeURI(http://www.cnblogs.com/season-huang/some other thing);
http://www.cnblogs.com/season-huang/some%20other%20thing;
其中,空格被編碼成了%20。但是如果你用了encodeURIComponent,那么結果變為
"http%3A%2F%2Fwww.cnblogs.com%2Fseason-huang%2Fsome%20other%20thing"
當你需要編碼URL中的參數的時候,那么encodeURIComponent是最好方法。
var param = "http://www.cnblogs.com/season-huang/"; //param為參數
param = encodeURIComponent(param);
var url = "http://www.cnblogs.com?next=" + param;
console.log(url) //"http://www.cnblogs.com?next=http%3A%2F%2Fwww.cnblogs.com%2Fseason-huang%2F"
參數中的 "/" 可以編碼,如果用encodeURI肯定要出問題,因為后面的/是需要編碼的
- 為什么要編碼
在計算機內部,所有的信息最終都表示為一個二進制的字符串。每一個二進制位(bit)有0和1兩種狀態,因此八個二進制位就可以組合出256種狀態,這被稱為一個字節(byte)。也就是說,一個字節一共可以用來表示256種不同的狀態,每一個狀態對應一個符號,就是256個符號,從0000000到11111111。
上個世紀60年代,美國制定了一套字符編碼,對英語字符與二進制位之間的關系,做了統一規定。這被稱為ASCII碼,一直沿用至今。
英語用128個符號編碼就夠了,但是其他國家文化的文字符號,遠遠沒法包含,所以有了將世界上所有的符號都納入其中的Unicode編碼
為了儲存的優化,又有了UTF-8
一般來說,URL只能使用英文字母、阿拉伯數字和某些標點符號,不能使用其他文字和符號。
意味著,如果URL中有其他字符,就必須編碼后使用
不同的操作系統、不同的瀏覽器、不同的網頁字符集,將導致完全不同的編碼結果。
所以用Javascript先對URL編碼,再向服務器提交,保證服務器得到的數據是格式統一的。
題目8: 補全如下函數,判斷用戶的瀏覽器類型
function isAndroid(){
return /Android/.test(navigator.userAgent);
}
function isIphone(){
return /iPhone/.test(navigator.userAgent);
}
function isIpad(){
return /iPad/.test(navigator.userAgent);
}
function isIOS(){
return /(iPad)|(iPhone)/i.test(navigator.userAgent);
}