歡迎光臨
每天分享高質量文章

這10道javascript筆試題你都會麼

1、考察this

var length = 10;

function fn() {

console.log(this.length);

}

var obj = {

length: 5,

method: function(fn) {

fn();

arguments[0]();

}

};

obj.method(fn, 1);

輸出:10 2

第一次輸出10應該沒有問題。我們知道取物件屬於除了點運運算元還可以用中括號,所以第二次執行時相當於arguments呼叫方法,this指向arguments,而這裡傳了兩個引數,故輸出arguments長度為2。

2、var和函式的提前宣告

function fn(a) {

console.log(a);

var a = 2;

function a() {}

console.log(a);

}

fn(1);

輸出:function a() {} 2

我們知道var和function是會提前宣告的,而且function是優先於var宣告的(如果同時存在的話),所以提前宣告後輸出的a是個function,然後程式碼往下執行a進行重新賦值了,故第二次輸出是2。

3、區域性變數和全域性變數

var f = true;

if (f === true) {

var a = 10;

}

function fn() {

var b = 20;

c = 30;

}

fn();

console.log(a);

console.log(b);

console.log(c);

輸出:10 報錯 30

這是個我犯了很久的錯誤,很長一段時間我都以為{…}內的新宣告的變數是區域性變數,後來我才發現function內的新宣告的變數才是區域性變數,而沒有用var宣告的變數在哪裡都是全域性變數。再次提醒切記只有function(){}內新宣告的才能是區域性變數,while{…}、if{…}、for(..) 之內的都是全域性變數(除非本身包含在function內)。

4、變數隱式宣告

if('a' in window) {

var a = 10;

}

alert(a);

答案:10

前面我說過function和var會提前宣告,而其實{…}內的變數也會提前宣告。於是程式碼還沒執行前,a變數已經被宣告,於是 ‘a’ in window 傳回true,a被賦值。

5、給基本型別資料新增屬性,不報錯,但取值時是undefined

var a = 10;

a.pro = 10;

console.log(a.pro + a);

var s = 'hello';

s.pro = 'world';

console.log(s.pro + s);

答案:NaN undefinedhello

給基本型別資料加屬性不報錯,但是取用的話傳回undefined,10+undefined傳回NaN,而undefined和string相加時轉變成了字串。

6、函式宣告優於變數宣告

console.log(typeof fn);

function fn() {};

var fn;

答案:function

因為函式宣告優於變數宣告。我們知道在程式碼逐行執行前,函式宣告和變數宣告會提前進行,而函式宣告又會優於變數宣告,這裡的優於可以理解為晚於變數宣告後,如果函式名和變數名相同,函式宣告就能改寫變數宣告。所以以上程式碼將函式宣告和變數宣告調換順序還是一樣結果。

7、判斷一個字串中出現次數最多的字元,並統計次數

hash table方式:

var s = 'aaabbbcccaaabbbaaa';

var obj = {};

var maxn = -1;

var letter;

for(var i = 0; i < s.length; i++) {

if(obj[s[i]]) {

obj[s[i]]++;

if(obj[s[i]] > maxn) {

maxn = obj[s[i]];

letter = s[i];

}

} else {

obj[s[i]] = 1;

if(obj[s[i]] > maxn) {

maxn = obj[s[i]];

letter = s[i];

}

}

}

alert(letter + ': ' + maxn);

正則方式:

var s = 'aaabbbcccaaabbbaaabbbbbbbbbb';

var a = s.split('');

a.sort();

s = a.join('');

var pattern = /(\w)\1*/g;

var ans = s.match(pattern);

ans.sort(function(a, b) {

return a.length < b.length;

});;

console.log(ans[0][0] + ': ' + ans[0].length);

8、經典閉包





 第一個連結 

第二個連結

第三個連結

第四個連結

dom汙染法:






 第一個連結 
 第二個連結 

 第三個連結 

 第四個連結 

贊(0)

分享創造快樂