javascript
JavaScript学习系列3 -- JavaScript arguments对象学习
在實際項目開發中,目前還是很少使用到JavaScript 中的arguments對象,那么它到底是干什么用的呢
arguments是JavaScript中的一個類數組對象,它代表傳給一個正在執行的函數function的參數列表。??
看完這個定義,需要明白,它是一個對象,不是一個數組,但是它這個對象卻又類似數組,也就是說樣子和數組類似. 那它的內容,它里面的內容是傳遞給正在執行的函數Function的參數列表
上面都特別強調,是 正在執行的函數function,這也就是說,arguments對象只有函數已經開始執行時,才可以使用,才能取到值。 所以, arguments對象存儲的是實際傳遞給函數的參數,而不是函數聲明時所定義的參數列表
我們來看一個例子,能夠更直觀的理解它
function showArgs() {console.log(arguments); }showArgs("a","1",{ test: "only for test" });執行結果如下["a","1",Object]上面的函數showArgs作用是輸出它的參數列表,當我們調用它?showArgs("a","1",{ test: "only for test" }) 時,可以看到,它總共包括3個參數,分別是”a“,"1",{ test: "only for test"?}, 其中,第三個{ test: "only for test"?}是個object, javascript無法直接輸出它,所以就輸出了object
如果要訪問其中某一個參數呢,arguments提供和數組一樣的方式來訪問單個參數,也就是使用下標arguments[0],arguments[1]來訪問.?
形式應該是這樣的 [function].arguments[n]? function在這里可以省略,表示的是當前正在執行的Function對象的名字
在上面的函數中, arguments[0] = "a", arguments[1] = "1" , arguments[2] = {test: "only for test"}
接下來,我們來看看arguments對象的一些屬性
1. length屬性
上面說了arguments是個類數組對象,它和數組一樣,也有一個length屬性,我們可以通過arguments.length來獲得傳入函數的參數個數
2. callee屬性
?arguments.callee的值,是當前正在被執行的函數,也就是說是當前這個arguments它所在的函數.? 我們上面論述了,arguments在函數被調用時才會有效,它才存在。 因此,在函數沒有被調用時 arguments.callee是不存在的.
另外 特別注意? 在JavaScript的嚴格模式下面, arguments.callee是不可以使用的
3. arguments轉成真正的數組
我們上面說了,arguments是一個類數組的對象,但不是數組,它雖然也有和數組一樣的length屬性,也可以像數組一樣采用arguments[n]下標形式進行訪問。 但它并不是數組,那么我們可以把它轉換為數組嗎 ? 答案是可以的
采用如下方法? ? Array.prototype.slice.call(arguments);? 還可以用一個簡易的寫法 [].slice.call(arguments);??
事實上, slice方法可以用來把滿足一定條件的對象轉換成數組, 這個在這里我們就不詳細論述了
我們來看一個例子
function TestArguments() {var testArray = Array.prototype.slice.call(arguments); //把arguments轉換成了真正的數組// var testArray = [].slice.call(arguments); //也可以這樣簡寫,也是把arguments轉換成數組 var sum = 0;testArray.forEach( //可以調用數組的forEach方法function(value){sum += value; });return sum; }當然,也可以調用JavaScript中的Array.from()方法來把arguments轉換為真正的數組
JS中的Array.from()方法就是用來從一個類似數組或者可迭代對象中創建一個新的數組實例.? 我們還是來看一個例子
function testfunc() {return Array.from(arguments); }testfunc(7,8,9); //輸出 [7,8,9]?4.? 用arguments來模擬重載
我們知道C# 語言中有重載,但是JavaScript中沒有重載. 我們舉一個例子來說明JavaScript中沒有重載
function add(arg1,arg2) //第1個add方法 {console.log("第一個add方法");return arg1 + arg2;}function add(arg1,arg2,arg3) //第2個add方法 {console.log("第2個add方法");return arg1 + arg2 + arg3;}add(1,2); //輸出 第2個add方法 add(1,2,3); //輸出 第2個add方法在上面的例子中,我們可以看到,函數調用的始終都是第2個add方法, 因為JavaScript是按照順序來執行的. 而不是像C#中那樣,存在函數重載,會根據參數的不同調用不同的重載函數?
但是我們如果想實現這樣的重載效果,有沒有方法來實現呢。 思考一下,它本質上就是根據參數個數不同輸出不一樣的結果,而實際傳入的參數個數是可以通過arguments來判斷的。?
我們來寫一個例子
function add(arg1,arg2,arg3) {if(arguments.length === 2){console.log(arg1 + arg2);} else if (arguments.length === 3){console.log(arg1 + arg2 + arg3);}}add(5,5); //輸出 10 add(5,5,5); // 輸出 15?5. arguments與默認參數
我們知道C#中有默認參數,我們來看看C#中默認參數的例子
public string add(int a, int b = 10, int c = 15) {return a + b + c; }?在這個例子中,傳入的參數b的默認值為10, c的默認值為15. 也就是說我們在調用add函數時,如果沒有給b和c傳值的話,就會使用它們的默認值10和15
那么,在JavaScript中,有沒有同樣的參數默認值設定呢,答案是有的,我們來看一個例子
function testfunc(firstArg = 0, secondArg =1) {console.log(firstArg,secondArg); }testfunc(100); //輸出 100 1看上面這個JavaScript函數,有兩個參數firstArg,secondArg. 兩個參數都有默認值,當調用該函數testfunc(100) 時,傳入了一個參數100,自然就是覆蓋了第一個參數,第2個參數沒有傳入,自然會取它的默認值1,所以輸出100,1
那這個又跟我們這篇博客中的arguments有什么關系的,我們來把它修改一下看看
function testfunc(firstArg = 0, secondArg =1) {console.log(arguments[0],arguments[1]);console.log(firstArg,secondArg); }testfunc(100); //輸出 100 undefined 100 1?
上面可以看到,當調用函數testfunc(100) 時, console.log(arguments[0],arguments[1]) 輸出的是 100 undefined, 也就是說arguments[1]還是沒有值,它沒有取默認傳入的參數secondArg=1
這樣符合arguments的定義,arguments指的是調用函數時,實際傳入的參數,在上面例子中,調用函數testfunc(100), 實際傳入的參數就是只有一個100. 由此可見,默認參數對arguments完全沒有影響
?
轉載于:https://www.cnblogs.com/wphl-27/p/9467422.html
總結
以上是生活随笔為你收集整理的JavaScript学习系列3 -- JavaScript arguments对象学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 傅里叶变换与拉普拉斯变换
- 下一篇: 使用XmlTextReader 读取XM