JavaScript面試題目集錦


這里是我到處搜集的一些JS題目,看起來比較簡單,但對基礎知識的考察還是很到位的。

有一些還可能是面試題。 題目的分析肯定會有不足的地方 ,如果能指正出來的話就再好不過了。不斷更新中……

這里還有幾個前端工程師面試題的文章 也一並推薦給大家

http://www.cnblogs.com/jscode/archive/2012/07/10/2583856.html#2425501

http://blog.jobbole.com/29269/


1.

var length = 9;
var foo = {
    bar: function() {
        return this.length;
    },
    length: 0
};
(function f(a, b) {
    f.length = 3;
    console.log(f.length);//
    console.log(arguments[0]());//
    console.log(a());//
    console.log((foo.bar)());//
    arguments[1]="XXX";
    console.log(b);//
})(foo.bar ,33,11);

①f.length是Function f的形參數量 函數聲明之后就不會變化了。
②執行時 arguments = [function(){return this.length;} , 33 , 11];
arguments[0]中的this指向的是arguments對象 而arguments.length 得到的是實參的個數(不管函數聲明的時候有幾個參數)
③a的獲得相當於 var a = foo.bar;這時a的調用對象是window 而不是foo 。
④(foo.bar)() === foo.bar()這個就不細說了
⑤通過arguments能夠改變實參的值

2.

用(0-9 A-Z a-z)生成任意長度(62位以內)的各個位都不重復的隨機字符串

3.

function A(){
    alert(this);
    eval('alert(this)');
    (function(){
        alert(this);
        eval('alert(this)');
    })()
}
new A()
分別彈出什么?

4. 

function A(){this.x=1;}
function B(){this.y=2;return "OK";}
function C(){this.z=3;return Object("OK");}
問:
new A();
new B();
new C();
三者分別是什么類型對象?(即用Object.getPrototypeOf(obj)獲得的值)
可參考另一篇文章《JS中用new 創建對象及在構造函數中return的使用

 5.

<script>
//① if (!("a" in window)) { var a = 1; } alert(a); //② function f(){ if (!("b" in window)) { var b = 1; } alert(b); } f(); </script>

  全局變量是window的屬性

  執行上下文分為進入執行上下文執行代碼兩部分。變量聲明和函數聲明在進入執行上下文階段就已完成。

  要注意的一點是 ①和②答案的不同原因在於 a 聲明的是全局變量 而b因為是在函數中,所以是局部變量。

6.

var a = 1;
alert(b);
var b = function a(x) { x && a(--x); } alert(a); ①這里的Function b 不是函數聲明 而是函數表達式。所以只能在執行到代碼的時候才會賦值。 ②Function b 中的 a 只是匿名函數的別名,而且是個只能在 Function b里使用的局部變量。 也就是說跟變量a沒有關系,不會發生覆蓋。

 7.

var a = 1;
function a() { }
function b() { }
var b;
console.log(a);
console.log(b);

//這里考察的是變量聲明,變量賦值,函數聲明的順序:
//進入執行上下文后先進行函數聲明,然后是變量聲明,最后進行變量賦值。並且如果函數或變量已經存在,將不會重新聲明。
//也就是說,即使把變量聲明並賦值寫到函數聲明前面,也還是會按照上面的順序進行。
上面的代碼等同於
function a() { }
function b() { }
var a, b;
a = 1;

8.

function A() {
    function m(){
        console.log(this);
    }
    this.test = function() {
        m.call(this);
        m.call(null);
    };
}
(new A()).test();

//this值的定義:當一個方法在對象上調用的時候,this就指向到了該對象上
//m.call(this)的結果肯定是沒問題的
//當call和apply的第一個參數是null或undefined時,參數將替換成window對象

 

9.
  找出某數字數組中的最大元素(使用Math.max函數)

var arr = [3,5,2,7,10,8];
①Math.max.apply([],arr);
②eval("(Math.max("+arr+"))");
這是目前看到的最好最簡潔兩種方案了,活用apply和eval
題外話:大家初學的時候都被告誡要“遠離”eval,實際上,如果合理使用的話,eval絕對是把利器。

 

10.
  轉化一個數字數組為function數組(每個function都彈出相應的數字)

var a = [2,4,6,3];
var b =a.map(function(i,o){
    return function(){return console.log(i);};
});

 

11.
  給object數組進行排序(排序條件是每個元素對象的屬性個數)

var arr = [
    {A:32,B:2,C:5},
    {A:32},
    {A:32,B:2,C:5,D:7},
    {A:32,B:2,C:5}
];
arr.sort(function(m,n){
    function getPropCount(obj){
        var i=0;
        if(typeof obj == "object"){
            for(var p in obj){
                ++i;
            }
        }
        return i;
    }
    return getPropCount(m) - getPropCount(n);
});

 

12.
  實現如下語法的功能:var a = (5).plus(3).minus(6); //5+3-6

Number.prototype.plus = function(num) {
    return this + num;
};
Number.prototype.minus = function(num) {
    return this - num;
};
console.log((5).plus(3).minus(6));

這里 (5).plus(3).minus(6) 可以用 5..plus(3).minus(6)代替
但不可以用 5.plus(3).minus(6) 
數字后面的第一個小數點是屬於數字部分的,相當於 5.0.plus(3),第二個才是調用方法。
所以 5.plus()是會出錯 而 5..plus()卻可以

 

13.
  實現如下語法的功能:var a = add(2)(3)(4)(111).....; //2+3+4+111+... 可無限擴展的。

function add(x) {
    function fn(m) {
        fn.pValue = m + (fn.pValue || 0);
        return fn;
    };
    fn.pValue = x;
    fn.toString = fn.valueOf = function() {
        return fn.pValue;
    }
    return fn;
}
這里主要考察的是toString的重載。例如下面的例子
var arr = [1,3,5]
console.log(arr+""); // "1,3,5"
Array.prototype.toString=function(){
    return this.join("--");
}
console.log(arr+""); // "1--3--5"

 

:以上第五到第十四題的出處 http://dmitry.baranovskiy.com/post/91403200

 

  沒有標准答案。 我在這里給出的答案也只是自己覺得不錯的答案而已。


14.

考點:with對作用域的影響

var x = 1;
(function() {
    var x = 2;

    function funcA() {
        console.log(this.x);
    }

    with ({
        funcB: function() { console.log(this.x); }
        , x: 3
    }) {
        function funcC() {
            console.log(this.x);
        }

        funcA();//?
        funcB();//?
        funcC();//?
    };
} ())

 

15
考點:setTimeout的執行時機

var A = true;
setTimeout(function(){
    A = false;
},1000);

while(A){}

alert("End");
//問:大約過多久會alert?

如果不清楚setTimeout中function的觸發時機的話,這絕對是個大坑


接下來的若干題目整理自http://perfectionkills.com/javascript-quiz/


16.

(function(){
    return typeof arguments;
  })();

 1.“object2.“array”
 3.“arguments”
 4.“undefined”

考點:arguments是類似於數組的對象,訪問方式與數組相同

17.

var f = function g(){ return 23; };
  typeof g();

 “number”
 “undefined”
 “function”
  Error

g是f方法的別用,且只能在f方法的內部使用

18.

(function(x){
    delete x;
    return x;
  })(3);

 3
null undefined Error

delete 只用於刪除某個對象的屬性,如果沒有指定對象的話,則默認是window
而這里面的形參x顯然不是屬性

19.

var y = 1, x = y = typeof x;
console.log(x);

 1
 “number”
 undefined
 “undefined”

考點:變量聲明與賦值的時機

20.

 (function f(f){
    return typeof f();
  })(function(){ return 1; });

 “number”
 “undefined”
 “function”
 Error

21.

var foo = {
    bar: function() { return this.baz; },
    baz: 1
};
(function(){
    return typeof arguments[0]();
})(foo.bar);

 “undefined”
 “object”
 “number”
 “function

22.

var foo = {
    bar: function(){ return this.baz; },
    baz: 1
  }
typeof (f = foo.bar)();

 “undefined”
 “object”
 “number”
 “function

23.

var f = (function f(){ return "1"; }, function g(){ return 2; })();
typeof f;
“string” “number” “
function” “undefined”

24.

var x = 1;
if (function f(){}) {
    x += typeof f;
}
x;
1 “1function” “1undefined” NaN

這個答案在瀏覽器間存在差異

25.

var x = [typeof x, typeof y][1];
typeof typeof x;

 “number”
 “string”
 “undefined”
 “object”

26.

(function(foo){
    return typeof foo.bar;
  })({ foo: { bar: 1 } });

 “undefined”
 “object”
 “number”
 Error

這個問題是考眼力的。。。
匿名函數的實參相當於 var arg = {foo:{bar:1}};
所以在函數執行的時候 相當於
var arg = {foo:{bar:1}};
return arg.bar;

27.

 (function f(){
    function f(){ return 1; }
    return f();
    function f(){ return 2; }
})();

 1
 2
 Error (e.g. “Too much recursion”)
 undefined

考點:函數的聲明與賦值時機

28.

function f(){ return f; }
new f() instanceof f;

 true
 false

相當於 f instanceof f;

29.

with (function(x, undefined){}) length;

 1
 2
 undefined
 Error

乍看好像有點蒙 分解一下就好了

var f = function(x,undefined){};
with(f){ length;
} //這句再恢復一下就是 with(f){ return f.length;}

30.

console.log(Function instanceof Object);
var arr = [];
console.log(arr.constructor === Array.prototype.constructor);

var num = new Number(2);
console.log(typeof num);

31.

(function(){
    var a=b=1;
})();
console.log(a);
console.log(b);

 a和b分別會輸出什么呢?

這個問題的陷阱就是,在立即執行函數表達式(IIFE)中,有兩個命名,但是其中變量是通過關鍵詞var來聲明的。這就意味着a是這個函數的局部變量。與此相反,b是在全局作用域下的。

這個問題另一個陷阱就是,在函數中他沒有使用"嚴格模式" ('use strict';)。如果 嚴格模式 開啟,那么代碼就會報出未捕獲引用錯誤(Uncaught ReferenceError):b沒有定義。

記住,嚴格模式要求你在需要使用全局變量時,明確地引用該變量。因此,你需要像下面這么寫:

(function(){
   'use strict';
   var a = window.b=1;
})();

 



 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM