騰訊面試題-----JavaScript中arguments對象解析


在騰訊面試中遇到了這樣問題:

js代碼
function test(x,y){  
  var x = 10;  
  alert(arguments[0],arguments[1]);  
}  
  
test();  


獲取arguments數據 Array.prototype.slice.call(arguments,1),返回一個數組[];

輸出結果是什麼?

這道題目主要是爲了區分js中的形參和實參,取得函數形參方法是arguments.callee.length,實參是arguments.length。

arguments[0],arguments[1] 取得是什麼結果吶?

arguments[0],arguments[1] :主要是用來取得用戶在調用test函數時候實際傳遞參數,
test函數期望的是2個參數,但是用戶調用的時候沒有給定實際實參,所以輸出結果是undefined,undefined但是如果這樣調用 test(1),那麼輸出將會是1,爲什麼結果是10而不是傳入的參數值1吶?是函數內部的優先級?還是函數內部的局部變量覆蓋了實參x?希望大牛的指點?

借用別人的解釋:

1,直接修改函數聲明時的形參

Js代碼

 function f1(a) {    
        alert(a);    
        a = 1;//修改形參a    
        alert(1 === a);    
        alert(1 === arguments[0]);    
    }    
    f1(10);    


函數f1定義了參數a,調用時傳參數10,先彈出10,修改a爲1,彈出兩次true,a和arguments[0]都爲1了。

2,通過函數內部的arguments對象修改

Js代碼

 function f2(a) {    
       alert(a);    
        arguments[0] = 1;//修改arguments    
        alert(1 === a);    
        alert(1 === arguments[0]);    
            
    }    

效果同f1。

3,函數內部聲明的局部變量與形參同名


Js代碼 
  

 function f3(a) {    
       alert(a);    
        var a = 1;//聲明局部變量a且賦值爲1    
        alert(1 === a);    
        alert(arguments[0]);    
    }    
    f3(10);    


函數f3定義了形參a,函數內部聲明局部變量a同時賦值爲1,但這裏的a仍然是參數a,從最後彈出的arguments[0]被修改爲1可以證明。


如果只是聲明局部變量a,卻不賦值,情況又不一樣了

Js代碼

 function f3(a) {    
        var a;//僅聲明,不賦值    
        alert(a);    
        alert(arguments[0]);    
    }    
    f3(10);    

這時候彈出的都是10,而不是undefined

結論:永遠不要去修改傳入參數,不僅程序難讀,而且難以查找的bug
發佈了7 篇原創文章 · 獲贊 8 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章