今天在跟蹤調試項目的代碼時,發現在一個function中用到了這么一段[].slice.call(arguments, 1) 的代碼。心中便起了疑惑,對於slice 和 call 的方法,倒是不怎么陌生,解析了下上面的那段代碼,就是為了獲取arguments 從1 開始到結尾的所有元素。只是覺得奇怪為什么不直接用 arguments.slice(1) 這樣去使用呢?(PS:JS當初是啃了《JavaScript權威指南》,可是后面也沒有怎么深入去用,最近轉來開發HTML5 Game 時,才發現好多基礎的東西都忘記的差不多了,汗!!!)。於是,就自己先做了下面的測試:
測試1 先打印下 arguments
var a = function(f){ console.log(arguments); } a('show', [12,3,4,55]);
結果:['show', Array[4]]
測試2
var a = function(f){ console.log([].slice.call(arguments, 1)); } a('show', [12,3,4,55]);
結果:[Array[4]]
測試3
var a = function(f){ console.log(arguments.slice(1)); } a('show', [12,3,4,55]);
結果:報錯!!! **arguments.slice is not a function(...)**
此時就心中產生了疑惑了,為啥在測試一中打印出來的arguments 是個數組的東西啊,為啥會提示沒有slice這個方法呢?帶着疑問我去請教下了隊伍里的大牛,得到了下面的答案:
測試4
(function() {
console.log(arguments instanceof Array)
})();
結果:false
arguments 並非數組,只是訪問單個參數的方式與訪問數組元素的方式相同。因此在使用slice方法的時候,需要用類似[].slice.call(arguments, 1) 的這種方式去調用,至此,關於這條語句引發的思考也就此結束了
.