騰訊面試題-----JavaScript中arguments物件解析
阿新 • • 發佈:2019-01-27
在騰訊面試中遇到了這樣問題:
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