所在實習公司的JS筆試題

在班上無聊的時候看到了一份JS筆試題(我是電面進去的,沒作過這份題~~),開始還以爲蠻簡單。。。。。。後來以爲仍是頗有意思的,貼出來一塊兒看看。html

題目一:web

if(!("a" in window)){
    var a = 1;
}
 alert(a);

題目二:函數

var a=1,
     b= function a(x){
         x&&a(-xx);
     };
 
alert(a);

題目三:this

 function a(x){ 
..     return x*2; 
.. }
   var a;
   alert (a);
    

題目四:spa

function b(x,y,a){ 
..   arguments[2] = 10; 
..   alert(a); 
.. }
   b(1,2,3);
    

題目五:3d

function a() {
    alert(this);
}
a.call(null);

題目六:
寫深度克隆的代碼。code

答案和分析:orm

題目一,有人認爲a沒有存在window裏面,因此輸出a=1,還有人認爲a在私有做用域,alert訪問不到。是undefined。htm

首先結果的確是undefined。先說第二種狀況,所謂私有做用域通常都是寫在function裏面的,在這些判斷語句裏面有賦值操做,就要看這些判斷語句所處的做用域,這裏很明顯全局的。因此a不是私有變量。對象

下面能夠嘗試輸入如下代碼試試:

alert(「a」 in window);
var a;

首先全部的全局變量均可以做爲window的屬性,window.a,因此能夠用上述方法查看a是否存在window中。上面的輸出是true,由於Js中全部的變量聲明都會在做用域的頂部(有點相似函數聲明的預編譯)。js引擎會首先搜索全部的變量聲明而後提到做用域的頂部,可是變量的賦值卻不會提早(若是是的話,能夠想像會發生不少不可預知的錯誤),var a=1;是等價於var a; a=1;的。
因此這道題,由於變量a會在做用域頂部存在window中,因此跳過賦值操做,輸出結果是undefined。

題目二:

function a(){
    return 1;
}
var a;
alert(typeof  a);    //"function"

這個題有點意思,上面說過函數聲明會提早,變量聲明也會提早,如今var a;要提早,function a也要提早。。。。。。到底誰會覆蓋誰呢?

function a(){
    return 1;
}
var a;
alert(typeof  a);    //"function"

很明顯上面上面中函數聲明會覆蓋變量聲明,優先級較高一點。可是改爲var a=1;以後結果倒是截然相反的。

 
function a(){
    return 1;
}
var a =1;
alert(typeof a);    //「number」
當變量申明遇到VO中已經有同名的時候,不會影響已經存在的屬性。var a;只是一個變量聲明,不會影響已經存在的function  a 的值。
而當賦值的時候,就會至關於重寫a。但要記住函數聲明會比變量聲明提早,因此通常會是被賦值重寫。
也許有人或說,a被重寫,在用a(--)豈不是會出現錯誤。在這裏a沒有被執行,通常 函數沒有被執行 內部沒有明顯語法錯誤 能夠當作黑盒


題目三:

題目二中有涉及,因此答案是function。。。。。。。。。。。。

題目四:

深刻理解JavaScript系列(12):變量對象(Variable Object)》中的函數上下文中的變量對象一節就能夠清楚地知道,活動對象是在進入函數上下文時刻被建立的,它經過函數的arguments屬性初始化。arguments屬性的值是Arguments對象:

AO = {   arguments: <ArgO> };

Arguments對象是活動對象的一個屬性,它包括以下屬性:

  1. callee — 指向當前函數的引用
  2. length — 真正傳遞的參數個數
  3. properties-indexes (字符串類型的整數) 屬性的值就是函數的參數值(按參數列表從左到右排列)。 properties-indexes內部元素的個數等於arguments.length. properties-indexes 的值和實際傳遞進來的參數之間是共享的。

這個共享其實不是真正的共享一個內存地址,而是2個不一樣的內存地址,使用JavaScript引擎來保證2個值是隨時同樣的,固然這也有一個前提,那就是這個索引值要小於你傳入的參數個數,也就是說若是你只傳入2個參數,而還繼續使用arguments[2]賦值的話,就會不一致,例如:

function b(x, y, a) {     arguments[2] = 10;     alert(a); } b(1, 2);

這時候由於沒傳遞第三個參數a,因此賦值10之後,alert(a)的結果依然是undefined,而不是10,但以下代碼彈出的結果依然是10,由於和a沒有關係。

function b(x, y, a) {     arguments[2] = 10;     alert(arguments[2]); } b(1, 2);

題目五:

根據ECMAScript262規範規定:若是第一個參數傳入的對象調用者是null或者undefined的話,call方法將把全局對象(也就是window)做爲this的值。因此,無論你何時傳入null,其this都是全局對象window,因此該題目能夠理解成以下代碼:

function a() {     alert(this); } a.call(window);

因此答案是object window。

題目六:

深度克隆,百度會有代碼的。

相關文章
相關標籤/搜索