web前端面試題整理 程序篇
1. var obj = ; (function (obj) { obj = ; })(obj); //問obj的值會改變嗎?
外部的obj不變.
因為匿名函數中obj傳入參數等於是創建了一個局部變數obj, 裡面的obj指向了一個新的對象 . 如果改成(function () { obj = ; })(obj); 就會改變了
想學好前端的可以來我們晚上的課堂聽課,每天晚上都會講一個小案例或小項目或分析前端面試以及工作和發展,更多的是談一些學習路線和方法,零基礎和原生JavaScript都有,可以加裙六二三九六六八零六(這些都是免費的,每天都有)給你課堂地址和往期錄製好的視頻。
2. var obj = { a:1, func: function() { (function () { a=2; }(); }} ; obj.func() //obj中a的值會改變嗎? 匿名函數里的this指向的是什麼?
obj里的a不會變. 匿名函數里的this指向全局對象window. 這等於是給window加了一個名為a的屬性
要改變obj中a的值 , 應當:
(function() {
this.a = 2
}).call(this);
或者obj中定義
func: function() {
var self = this;
(function(){
self.a=2;
})();}
3. 要實現函數內每隔5秒調用自己這個函數,100次以後停止,怎麼辦?
(function(){
var index = 0;
function fn(){
if(index
index++;
setTimeout(function(){
fn();
},5000);
}
}
fn();
})();
4. 點擊一個ul的五個li元素,分別彈出他們的序號,怎麼做?
方法1
var oLi = document.getElementsByTagName('li');
for(var i=0; i
oLis[i].onclick = (function(j){
return function(){
alert(j);
}
})(i);
}
方法2:
ar oLi = document.getElementsByTagName('li');
for(var i=0; i
(function(j){
oLi[j].onclick = function(){
alert(j);
};
})(i);
}
方法3:
var oLi = document.getElementsByTagName('li');
for(var i=0; i
oLi[i].index = i;
oLi[i].onclick = function(){
alert(this.index);
}
}
5. js實現數組去重怎麼實現?
方法1. 創建一個新的臨時數組來保存數組中已有的元素
var a = new Array(1,2,2,2,2,5,3,2,9,5,6,3);
var n = []; //一個新的臨時數組
for(var i=0; i
//如果把當前數組的第i已經保存進了臨時數組, 那麼跳過
if(n.indexOf(this[i]) == -1){
n.push(this[i]);
}
}
return n;
}
console.log(a.unique1());
方法2.
使用哈希表存儲已有的元素
var hash = {},
n = []; //hash 作為哈希表, n為臨時數組
for(var i=0; i
if(!hash[this[i]]){ //如果hash表中沒有當前項
hash[this[i]] = true; //存入hash表
n.push(this[i]); //當前元素push到臨時數組中
}
}
return n;
}
方法3.
使用indexOf判斷數組元素第一次出現的位置是否為當前位置
var n = [this[0]];
for(var i=1; i
{
//如果當前數組元素在數組中出現的第一次的位置不是i
//說明是重複元素
if(this.indexOf(this[i]) == i){
n.push(this[i]);
}
}
return n;
}
方法4.
先排序再去重
this.sort(function(a, b){ return a - b;});
var n = [this[0]];
for(var i=1; i
if(this[i] != this[i-1]){
n.push(this[i]);
}
}
return n;
}
第一種方法和第三種方法都使用了indexOf(), 這個函數的執行機制也會遍曆數組
第二種方法使用了一個哈希表, 是最快的.
第三種方法也有一個排序的複雜度的計算.
然後做了個測試, 隨機生成100萬個0-1000的數組結果如下:
第三種方法總是第二種方法的將近兩倍, 而第四種方法與數組的範圍有關,
如果是0-100的數組
而如果是0-10000, 方法四看著就效果還不錯了
而第二種方法永遠是最好的, 但是是以空間換時間
全部代碼如下
var a = [];
for(var i=0; i
a.push(Math.ceil(Math.random()*10000));
}
var n = []; //一個新的臨時數組
for(var i=0; i
//如果把當前數組的第i已經保存進了臨時數組, 那麼跳過
if(n.indexOf(this[i]) == -1){
n.push(this[i]);
}
}
return n;
}
var hash = {},
n = []; //hash 作為哈希表, n為臨時數組
for(var i=0; i
if(!hash[this[i]]){ //如果hash表中沒有當前項
hash[this[i]] = true; //存入hash表
n.push(this[i]); //當前元素push到臨時數組中
}
}
return n;
}
var n = [this[0]];
for(var i=1; i
{
//如果當前數組元素在數組中出現的第一次的位置不是i
//說明是重複元素
if(this.indexOf(this[i]) == i){
n.push(this[i]);
}
}
return n;
}
this.sort(function(a, b){ return a - b;});
var n = [this[0]];
for(var i=1; i
if(this[i] != this[i-1]){
n.push(this[i]);
}
}
return n;
}
var begin1 = new Date();
a.unique1();
var end1 = new Date();
var begin2 = new Date();
a.unique2();
var end2 = new Date();
var begin3 = new Date();
a.unique3();
var end3 = new Date();
var begin4 = new Date();
a.unique4();
var end4 = new Date();
console.log("方法一執行時間:" + (end1 - begin1));
console.log("方法二執行時間:" + (end2 - begin2));
console.log("方法三執行時間:" + (end3 - begin3));
console.log("方法四執行時間:" + (end4 - begin4));
想學好前端的可以來我們晚上的課堂聽課,每天晚上都會講一個小案例或小項目或分析前端面試以及工作和發展,更多的是談一些學習路線和方法,零基礎和原生JavaScript都有,可以加裙六二三九六六八零六(這些都是免費的,每天都有)給你課堂地址和往期錄製好的視頻。
點擊展開全文
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※前端開發人員必須了解的七大技能圖譜
※想成為web前端工程師?必學這6大技能!
TAG:IT技術java交流 |
※Vue前端面試題
※整理的最全 python常見面試題
※python簡單面試題
※Google面試官抖出自己的面試題,有詳細的分解過程
※Google 經典面試題解析
※Android面試題推薦
※自動化測試Selenium最新面試題和對應答案!
※百道Python面試題實現,搞定Python編程就靠它
※Swift面試題(1)
※搞定這套 Python 爬蟲面試題,面試會 so easy
※Python 經典面試題 21 道
※Python經典面試題21道
※Hibernate面試題大全
※常見Python面試題 — 手寫代碼系列
※68道Spring面試題和答案
※關於 ArrayList 的 5 道面試題
※前端面試寶典,面試題,面試經驗
※30道Spring面試題和答案
※一道 js 閉包面試題的學習
※記一次前端面試題