javascript
JavaScript中的arguments对象
JavaScript中的arguments對象
arguments?是一個類似數(shù)組的對象, 對應(yīng)于傳遞給函數(shù)的參數(shù)。
語法
arguments
描述
arguments對象是所有函數(shù)中可用的局部變量。你可以使用arguments對象在函數(shù)中引用函數(shù)的參數(shù)。此對象包含傳遞給函數(shù)的每個參數(shù)的條目,第一個條目的索引從0開始。例如,如果一個函數(shù)傳遞了三個參數(shù),你可以參考它們?nèi)缦?#xff1a;
arguments[0]
arguments[1]
arguments[2]
參數(shù)也可以被設(shè)置:
| arguments[1] = 'new value'; |
arguments對象不是一個?Array?。它類似于數(shù)組,但除了 長度之外沒有任何數(shù)組屬性。例如,它沒有?pop?方法。但是它可以被轉(zhuǎn)換為一個真正的數(shù)組::
| let args = Array.prototype.slice.call(arguments); let args = [].slice.call(arguments); |
你還可以使用?Array.from()方法或?spread?運算符將 arguments 轉(zhuǎn)換為真正的數(shù)組:
| let args = Array.from(arguments); let args = [...arguments]; |
對參數(shù)使用slice會阻止某些JavaScript引擎中的優(yōu)化 (比如 V8 引擎)。
如果你關(guān)心它們,嘗試通過遍歷arguments對象來構(gòu)造一個新的數(shù)組。
另一種方法是使用 被忽視的/鄙視/輕視,/看不起 Array構(gòu)造函數(shù)作為一個函數(shù):
| let args = ( arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments) ); |
如果 Array generics 可用的話,下面的代碼可以作為替代:
| var args = Array.slice(arguments); |
-
arguments 對象僅在函數(shù)內(nèi)部有效,在函數(shù)外部調(diào)用 arguments 對象會出現(xiàn)一個錯誤。
-
arguments的typeof返回’object‘。
-
console.log(typeof arguments); // 'object'
-
可以使用索引來確定各個arguments的類型。
| console.log(typeof arguments[0]); //這將返回單個參數(shù)的typeof。 |
如果你調(diào)用一個函數(shù),當(dāng)這個函數(shù)的參數(shù)數(shù)量比它顯式聲明的參數(shù)數(shù)量更多的時候,你就可以使用 arguments 對象。這個技術(shù)對于參數(shù)數(shù)量是一個可變量的函數(shù)來說比較有用。 你可以用 arguments.length 來得到參數(shù)的數(shù)量,然后可以用 arguments object 來對每個參數(shù)進(jìn)行處理。 (想要得到函數(shù)簽名的參數(shù)數(shù)量, 請使用 Function.length 屬性。)
屬性
| arguments.callee // 指向當(dāng)前執(zhí)行的函數(shù)。 arguments.caller // 指向調(diào)用當(dāng)前函數(shù)的函數(shù)。 arguments.length // 指向傳遞給當(dāng)前函數(shù)的參數(shù)數(shù)量。 |
例子
定義一個連接幾個字符串的函數(shù)
這個例子定義了一個函數(shù)來連接字符串。這個函數(shù)唯一正式聲明了的參數(shù)是一個字符串,該參數(shù)指定一個字符作為銜接點來連接字符串。該函數(shù)定義如下:
| function myConcat(separator) { var args = Array.prototype.slice.call(arguments, 1); return args.join(separator); } |
你可以傳遞任意數(shù)量的參數(shù)到該函數(shù),然后該函數(shù)會將每個參數(shù)作為一個條目來創(chuàng)建一個列表。
| myConcat(", ", "red", "orange", "blue"); // returns "red, orange, blue" myConcat("; ", "elephant", "giraffe", "lion", "cheetah"); // returns "elephant; giraffe; lion; cheetah" myConcat(". ", "sage", "basil", "oregano", "pepper", "parsley"); // returns "sage. basil. oregano. pepper. parsley" |
定義一個創(chuàng)建HTML列表的方法
這個例子定義了一個函數(shù)通過一個字符串來創(chuàng)建HTML列表。這個函數(shù)唯一正式聲明了的參數(shù)是一個字符。當(dāng)該參數(shù)為 “u” 時,創(chuàng)建一個無序列表 (項目列表);當(dāng)該參數(shù)為 “o” 時,則創(chuàng)建一個有序列表 (編號列表)。該函數(shù)定義如下:
| function list(type) { var result = "<" + type + "l><li>"; var args = Array.prototype.slice.call(arguments, 1); result += args.join("</li><li>"); result += "</li></" + type + "l>"; // end list return result; } |
你可以傳遞任意數(shù)量的參數(shù)到該函數(shù),然后該函數(shù)會將每個參數(shù)作為一個條目添加到第一個參數(shù)指定類型的列表當(dāng)中。
| var listHTML = list("u", "One", "Two", "Three"); /* listHTML is: "<ul><li>One</li><li>Two</li><li>Three</li></ul>" */ |
注意
ES6中的箭頭函數(shù)沒有自己的?arguments?對象,不過在大多數(shù)情形下,rest參數(shù)可以給出一個解決方案:
| let a; const fn = (...rest) => Array.prototype.slice.call(rest, 1); a = fn(1, 2); // [2] |
總結(jié)
以上是生活随笔為你收集整理的JavaScript中的arguments对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: concurrent包下的Exchang
- 下一篇: ajax+lazyload时lazylo