為啥會寫這個块促,前幾天面試的時候,面試官問我床未,arguments 是數(shù)組么竭翠,我說是的。因?yàn)樵谑褂玫倪^程中薇搁,都是直接用下標(biāo)和length 去取值斋扰,未曾想過調(diào)用一些數(shù)組的方法。面試官說啃洋,arguments是一個偽數(shù)組传货。印象深刻。所以今天看一下宏娄。
總結(jié):
- arguments 不是一個數(shù)組问裕,是一個對象 ,可以使用 .length屬性孵坚,索引
- 可以轉(zhuǎn)換成數(shù)組 (為啥要轉(zhuǎn)粮宛,為啥要修改本不應(yīng)該修改的值)
- 有 .callee() 方法執(zhí)行函數(shù) (嚴(yán)格模式下刪除) 貌踏。 .caller() 獲取當(dāng)前的調(diào)用位置 (瀏覽器中輸出為 undefined)
一些小測試
function test(){
console.log(arguments ); //Arguments [123, callee: ?, Symbol(Symbol.iterator): ?] 0: 123 ,callee: ? test() ,length: 1 ,Symbol(Symbol.iterator): ? values(), __proto__: Object
console.log( typeof arguments ); // object (string類型的)
console.log( Array.isArray(arguments) ); // false
console.log( arguments.__proto__.constructor()); // 空對象 {} ,有對象的原型鏈
console.log(arguments.caller) // 獲取當(dāng)前的調(diào)用函數(shù) , 瀏覽器調(diào)試工具中輸出:undefined
}
描述
arguments對象是所有 (非箭頭) 函數(shù)中都可用的局部變量窟勃。你可以使用arguments對象在函數(shù)中引用函數(shù)的參數(shù)祖乳。此對象包含傳遞給函數(shù)的每個參數(shù),第一個參數(shù)在索引0處秉氧。參數(shù)也可以被設(shè)置眷昆。
arguments
對象不是一個 Array
。它類似于Array
汁咏,但除了length屬性和索引元素之外沒有任何Array
屬性亚斋。例如,它沒有 pop 方法攘滩。
但是它可以被轉(zhuǎn)換為一個真正的Array:
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
// ES2015
const args = Array.from(arguments);
const args = [...arguments];
/*
對參數(shù)使用slice會阻止某些JavaScript引擎中的優(yōu)化 (比如 V8 - [更多信息](https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#3-managing-arguments))帅刊。如果你關(guān)心性能,嘗試通過遍歷arguments對象來構(gòu)造一個新的數(shù)組漂问。另一種方法是使用被忽視的`Array`構(gòu)造函數(shù)作為一個函數(shù)
*/
var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));
arguments 屬性
-
arguments.callee
- 指向當(dāng)前執(zhí)行的函數(shù)赖瞒。
-
arguments.caller
- 指向調(diào)用當(dāng)前函數(shù)的函數(shù)。
-
arguments.length
- 指向傳遞給當(dāng)前函數(shù)的參數(shù)數(shù)量蚤假。
注意:現(xiàn)在在嚴(yán)格模式下栏饮,arguments
對象已與過往不同。[arguments[@@iterator]](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/@@iterator)
不再與函數(shù)的實(shí)際形參之間共享磷仰,同時caller屬性也被移除